查询返回顶部项目为每个不同的列值
如果我有一个表具有以下字段查询返回顶部项目为每个不同的列值
ID, SomeFK, SomeTime
我将如何编写一个查询返回的最新/前3项(基于SomeTime
)每个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()
不能使用!
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
道歉,我错过了一些关键信息。这是针对SQL2000的,因此不能使用ROW_NUMBER()! – 2012-08-15 09:29:21
请参阅编辑。显然,我没有在SQL2000上测试过它...... :) – podiluska 2012-08-15 09:45:00
我接受这个作为最好的解决方案。我会在最后加上以下警告:'有时候不是空的 order by somefk,有时候desc' – 2012-08-15 10:22:13
我想我理解正确的,你,你能不能选择max
一段时间,然后组,像这样:
select SomeFK, max(SomeTime)
from Table
group by SomeFK
我可能是没谱这里,因为我不能完全肯定你最近的意思是什么?
最近,我的意思是'时间一流'。这个例子应该澄清 – 2012-08-15 09:30:31
基于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
虽然我更喜欢现在接受的解决方案。
请参阅[“基于串联的解决方案”](http://www.sqlmag.com/content1/topic/optimizing-top-n-per-group-queries/catpath/departments/page/3)部分对于2000年的一种方法。 – 2012-08-15 09:34:37
@MartinSmith你可以在2000年使用CTE吗? – podiluska 2012-08-15 09:36:15
@podiluska - 不,他们只是2005+。你可以使用派生表。实际上刚刚意识到早期的链接不适合,因为只适用于N = 1。 [2000另一种方法是在这里](http://archive.msdn.microsoft.com/SQLExamples/Wiki/View.aspx?title=SelectTopNByGroup#SQL2000) – 2012-08-15 09:36:50