2014-06-05 94 views
0

我有一個數據庫表,它的結構是這樣的:返回最近的數據

CREATE table match (ID1 int, ID2 int, CreatedDate, ConnectDisconnect) 

我想寫一個SQL語句將返回ID1和ID2分組最近的複賽戰績。例如,請參見下面的數據:

1,2,'2014-06-05', C 
1,3,'2014-06-05', C 
1,4,'2014-06-05', C 
N1,N2,'2014-06-05',D 

請參考下面的SQL語句:

select max(CreatedDate), ID1,ID2 FROM match 
group by ID1,ID2 

這將顯示在上ID1和ID2做出的最新決定。問題在於匹配的記錄可以是任何方式。例如:

1,2,'2014-06-04', C 
2,1,'2014-06-05', D 

以上數據顯示記錄1和2在04/06/2014連接並在05/06/2014斷開連接。我上面的查詢將返回兩行,但我只希望它返回一行,即最近(上述情況下日期爲05/06/14的數據)。

+0

那麼,如果你只有一個日期列(不是日期時間),那麼你如何知道哪一行更近? – Andrew

回答

1

這是一種方法,使用caserow_number()

select m.* 
from (select m.*, 
      row_number() over (partition by (case when id1 < id2 then id1 else id2 end), 
              (case when id1 < id2 then id2 else id1 end) 
           order by CreatedDate desc 
           ) as seqnum 
     from match m 
    ) m 
where seqnum = 1; 
+0

對不起,延遲閱讀此內容。這些ID不總是整數,例如N1,N2等,所以我不相信這會起作用。我已經更新了這個問題。你同意嗎? – w0051977

+0

(1)問題*清楚*指定'id's是整數。 (2)無關緊要,只要爲該類型定義了<<(它是爲SQL基類型定義的)。 –

0

這是醜陋的,但是這可能會做你想做的(不知道什麼串聯的語法是SQL Server):

select max(CreatedDate), case when ID1 < ID2 concat(ID1,',',ID2) else concat(ID2,',',ID1) end as combinedIds 
FROM match 
group by case when ID1 < ID2 concat(ID1,',',ID2) else concat(ID2,',',ID1) end