如何从每个组中获得前1名

时间:2014-11-06 14:01:24

标签: sql informix

这是针对IBM informix

我有一个带有id和日期时间的表(更多但是包含它们)

每个id都有多个不同日期时间的条目,我希望每个id的最高结果按日期时间排序。

我试过了:

SELECT FIRST 1 * FROM Table WHERE id IN (32,33,35,36,37,50,51) ORDER BY datetime

当然,这给了我一个结果 - 来自其中一个id的最佳日期时间。我想从每个id中得到一个结果。

是否有一个简单的解决方案或我是否需要为每个ID创建一个选择?

2 个答案:

答案 0 :(得分:2)

select t1.*
from table t1
join
(
  SELECT id, max(datetime) as dt
  FROM Table 
  WHERE id IN (32,33,35,36,37,50,51) 
  GROUP BY id
) t2 on t1.id = t2.id and t1.datetime = t2.dt
ORDER BY t1.datetime

答案 1 :(得分:0)

juergen代码是正确的,并且具有良好的性能。

我还有另一个查询 试试这个

 Create Table Sample1(id Int,mydate Datetime )
 Declare @DateTime Datetime =getdate()

 Insert into Sample1 Values(1,getdate())
 Insert into Sample1 Values(1,DateAdd(MI,1,getdate()))
 Insert into Sample1 Values(1,DateAdd(MI,2,getdate()))
 Insert into Sample1 Values(1,DateAdd(MI,3,getdate()))
 Insert into Sample1 Values(2,getdate())
 Insert into Sample1 Values(2,DateAdd(MI,1,getdate()))
 Insert into Sample1 Values(2,DateAdd(MI,2,getdate()))
 Insert into Sample1 Values(2,DateAdd(MI,3,getdate()))
 Insert into Sample1 Values(3,getdate())
 Insert into Sample1 Values(3,DateAdd(MI,1,getdate()))
 Insert into Sample1 Values(3,DateAdd(MI,2,getdate()))
 Insert into Sample1 Values(3,DateAdd(MI,3,getdate()))

 select id,mydate from 
 (
   SELECT ROW_NUMBER() Over (Partition by Id Order by mydate desc) as dt,id,mydate
   FROM Sample1  
 ) A Where dt=1

 Drop Table Sample1

由于