一条数据库查询语句

IDTIMEVALUE
111
212
312
122
233
341
152
253
354
161
272
381

取出所有ID(1,2,3) 最近时间的一条记录

也就是

IDTIMEVALUE
161
272
381

 


问题补充:
补充ID有16万左右

整个表数据有两亿
问题补充:
每个ID在同一时间不会有重复的记录

可以把ID和Time视为主键

这个表的记录是这样插入的

每隔一定时间

就分别插入 所有ID在插入时间的值,在这个例子里就是插入ID1,2,3 三条在最近时刻的值



还有我要取的不是Max(value)是每一个ID在他MAX(time)时对应的Value

我自己写了一个但是 数据量太大,根本没办法执行

select *

  from table a,

       (select b.id, max(b.time) time

          from table  b

         group id) c

where a.id = c.id

   and a.time= c.time

在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]

就是每当有插入的时候
就触发把新记录更新到另一个表中。