查询返回每个不同列值的顶级项目

时间:2012-08-15 09:16:17

标签: sql sql-server sql-server-2000 greatest-n-per-group

如果我有一个包含以下字段的表

ID, SomeFK, SomeTime

如何编写查询返回每个SomeTime的最新/前3项(基于SomeFK)。

所以,结果可能看起来像

SomeFK    Sometime
0         2012-07-05 
0         2012-07-04 
0         2012-07-03 
1         2012-07-03 
1         2012-07-02 
1         2012-07-01 
2         2012-07-03 
2         2012-07-02 
2         2012-07-01 
....etc....

返回特定SomeFK的最新项目很简单,但我无法想到如何为上述内容做到这一点。我也觉得应该死得很简单!

修改

道歉,我错过了一些关键信息。这适用于SQL2000,因此无法使用ROW_NUMBER()

3 个答案:

答案 0 :(得分:9)

SELECT SomeFk, SomeTime 
FROM 
    (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY SomeFK ORDER BY sometime desc) rn
    FROM yourtable
    ) v
WHERE rn<=3
ORDER BY somefk, rn

对于SQL 2000,我建议升级到支持的平台。

但如果你坚持的话。

select *
from yourtable t1
where
    (select COUNT(*)
     from yourtable
     where somefk = t1.somefk
     and sometime>=t1.sometime
    ) <=3

答案 1 :(得分:0)

我认为我理解正确,你不能选择max SomeTime然后分组,如下:

select SomeFK, max(SomeTime) 
from Table
group by SomeFK

我在这里可能不合时宜,因为我不完全确定你最近的意思。

答案 2 :(得分:0)

基于this link(作为原始问题的评论提供)。一个解决方案是:

SELECT DISTINCT ID, SomeFK, SomeTime
FROM SomeTable t1
WHERE ID IN (SELECT TOP 3 ID
               FROM SomeTable t2
              WHERE t2.SomeFK= t1.SomeFK
              ORDER BY SomeTime DESC)
ORDER BY SomeFK, SomeTime DESC

虽然我现在更喜欢接受的解决方案。