ID | TIME | VALUE |
1 | 1 | 1 |
2 | 1 | 2 |
3 | 1 | 2 |
1 | 2 | 2 |
2 | 3 | 3 |
3 | 4 | 1 |
1 | 5 | 2 |
2 | 5 | 3 |
3 | 5 | 4 |
1 | 6 | 1 |
2 | 7 | 2 |
3 | 8 | 1 |
取出所有ID(1,2,3) 最近时间的一条记录
也就是
ID | TIME | VALUE |
1 | 6 | 1 |
2 | 7 | 2 |
3 | 8 | 1 |
在ORACLE下,可以用分析函数ROWNUMBER()来实现
[code="SQL"]
SELECT
X.ID
, X.TIME
, X.VALUE
FROM
(
SELECT
ROW_NUMBER() OVER(PARTITION BY ID ORDER BY TIME DESC) AS ROW_NO
, ID
, TIME
, VALUE
FROM TABLE
) X
WHERE X.ROW_NO = 1
[/code]
不过我比较认同LS的解决办法
性能问题有许多是设计问题
之所以会造成性能问题,是因为设计者把主业务表与履历表合成一张表了
对于这种履历型数据,如果不把当前最新处理数据与历史数据分来存储的话
在当前这个CASE下,总有一天会发生性能问题的
所以,设计时应当把最新数据放到主业务表中,历史数据放到履历表中
当有更加新的数据需要插入的时候,把主业务表中的既存数据转存到履历表
这样一来,因为主业务表中的数据量总是维持在一个比较低的水平
至少主要业务的性能不会有问题
这样就可以了:
[code="sql"]
select id,max(time),value from tableName group by id
[/code]
按照楼主的要求应该可能不止三条记录
比如下面的数据
ID TIME VALUE
1 6 1
2 7 2
3 8 1
3 8 2
3 8 2
如果不会出现上面的情况,可以用下面一句。
[code="sql"]select id,max(time),max(value) from table1 group by id [/code]
上面我写错了这样应该还可以:
[code="sql"]
select * from tableName where time in (select max(time) from tableName group by id ) group by id
[/code]
如果这样的话,推荐:
1.建立time,value索引。
2.用任务计划,在晚上凌晨的时候做查询,然后将结果集放入一个新表中。然后后期可以递增地在新表中添加值。
3.如果是Oracle,可以根据TIME将数据分区。
用一个触发器就能解决勒,
反正你要的只是最新的记录嘛。
只是一个思路 具体该怎么写看Google。
[code="sql"]
create tiger ItoU on UrTable for insert
as if(id)
begin
update newTable select * from inserted
end
[/code]
就是每当有插入的时候
就触发把新记录更新到另一个表中。