2012-08-15 48 views
1

如果我有一個表具有以下字段查詢返回頂部項目爲每個不同的列值

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

回答

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

0

我想我理解正確的,你,你能不能選擇max一段時間,然後組,像這樣:

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

我可能是沒譜這裏,因爲我不能完全肯定你最近的意思是什麼?

+0

最近,我的意思是'時間一流'。這個例子應該澄清 – 2012-08-15 09:30:31

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 

雖然我更喜歡現在接受的解決方案。

+0

潛在的缺點是你不能參數化一個頂級命令 - 也就是說如果你有一個程序想要返回最前面的N ......但是這可能不適用於這種情況 – podiluska 2012-08-15 10:12:45

+0

實際上,查詢也像狗一樣運行。我打算把它和你的朋友一起去吧 – 2012-08-15 10:20:37

+0

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

相關問題