如果我有一个包含以下字段的表
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()
!
答案 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
虽然我现在更喜欢接受的解决方案。