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

问题描述:

如果我有一个表具有以下字段查询返回顶部项目为每个不同的列值

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()不能使用!

+0

请参阅[“基于串联的解决方案”](http://www.sqlmag.com/content1/topic/optimizing-top-n-per-group-queries/catpath/departments/page/3)部分对于2000年的一种方法。 – 2012-08-15 09:34:37

+0

@MartinSmith你可以在2000年使用CTE吗? – podiluska 2012-08-15 09:36:15

+0

@podiluska - 不,他们只是2005+。你可以使用派生表。实际上刚刚意识到早期的链接不适合,因为只适用于N = 1。 [2000另一种方法是在这里](http://archive.msdn.microsoft.com/SQLExamples/Wiki/View.aspx?title=SelectTopNByGroup#SQL2000) – 2012-08-15 09:36:50

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 
+0

道歉,我错过了一些关键信息。这是针对SQL2000的,因此不能使用ROW_NUMBER()! – 2012-08-15 09:29:21

+0

请参阅编辑。显然,我没有在SQL2000上测试过它...... :) – podiluska 2012-08-15 09:45:00

+0

我接受这个作为最好的解决方案。我会在最后加上以下警告:'有时候不是空的 order by somefk,有时候desc' – 2012-08-15 10:22:13

我想我理解正确的,你,你能不能选择max一段时间,然后组,像这样:

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

我可能是没谱这里,因为我不能完全肯定你最近的意思是什么?

+0

最近,我的意思是'时间一流'。这个例子应该澄清 – 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 

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

+0

潜在的缺点是你不能参数化一个*命令 - 也就是说如果你有一个程序想要返回最前面的N ......但是这可能不适用于这种情况 – podiluska 2012-08-15 10:12:45

+0

实际上,查询也像狗一样运行。我打算把它和你的朋友一起去吧 – 2012-08-15 10:20:37

+0

我的情况可能会更糟糕,表现明智...... :) – podiluska 2012-08-15 10:22:34