2013-04-25 68 views
1

我正在使用Microsoft SQL。我有一張表,其中包含由兩個不同類別和日期存儲的信息。例如:T-SQL按最舊日期和唯一類別選擇行

ID Cat1 Cat2 Date/Time Data 
1 1  A  11:00  456 
2 1  B  11:01  789 
3 1  A  11:01  123 
4 2  A  11:05  987 
5 2  B  11:06  654 
6 1  A  11:06  321 

我想爲每個Cat1和Cat2的唯一組合提取一行,並且我需要具有最早日期的行。另外,在上述我想ID = 1,2,4,和5

由於

+0

你已經嘗試過一些東西,並得到堆疊或只是想從沒有完整的解決方案? – MarcinJuraszek 2013-04-25 17:57:44

+0

此問題沒有顯示任何研究工作。 **做你的作業很重要**。告訴我們你發現了什麼,***爲什麼它不符合你的需求。這表明你已經花時間去嘗試幫助你自己了,它使我們避免重申明顯的答案,最重要的是它可以幫助你得到更具體和相關的答案。 [FAQ](http://stackoverflow.com/questions/how-to-ask)。 – Kermit 2013-04-25 18:36:24

+0

嗯,那麼你如此有用地稱爲FAQ的鏈接似乎沒有提及任何有關列出所有「無效」答案的內容。它也表明,如果我問一個模糊的問題,我會得到一個類似的答案......對我來說很有意義。問題是我得到了一個夢幻般的答案,但我不會在一百萬年內。至於什麼不起作用,那麼我不願意解釋我嘗試過的所有不同的東西,就像選擇不同的東西一樣工作,因爲它不會以特定的順序返回任何東西,也不會實際返回我想要的數據。 – drew 2013-04-25 20:52:53

回答

5

看一看row_number() MSDN上。

SELECT * 
FROM (
     SELECT *, 
       ROW_NUMBER() OVER (PARTITION BY col1, col2 ORDER BY date_time, id) rn 
     FROM mytable 
     ) q 
WHERE rn = 1 

(運行SQL Fiddle代碼)

+0

很酷。這就是訣竅。我也不知道SQL小提琴,這是整潔。謝謝 – drew 2013-04-25 20:48:23

2

Quassnoi的answer是好的,但我有點不舒服就如何處理的DUP。它似乎根據插入順序返回,但我不確定這是否可以保證? (看到這兩個小提琴對於其中基於插入順序結果的變化爲例:dup at the enddup at the beginning

另外,我有點像老派的SQL住時,我可以,所以我會做這種方式(見this fiddle對於它如何處理dups):

select * 
from my_table t1 
    left join my_table t2 
    on t1.cat1 = t2.cat1 
    and t1.cat2 = t2.cat2 
    and t1.datetime > t2.datetime 
where t2.datetime is null 
+0

看到我的帖子更新,它現在將返回第一個'id'的情況下,平局。你的查詢將返回所有重複的情況下,一個領帶。窗口函數也可以這樣做,只需用'RANK()'替換'ROW_NUMBER()'。 – Quassnoi 2013-04-26 08:09:39