2015-02-05 48 views
0

不知道如何標題或問這個問題。說我得到這樣設置在連接兩個表的結果,一個包含Id(C),另一個包含RatingCreatedDate(R)與外鍵第一個表:SQL查詢:根據最新日期獲取唯一的ID /日期組合 - 需要提高速度

----------------------------------- 
| C.Id | R.Rating | R.CreatedDate | 
----------------------------------- 
| 2 | 5  | 12/08/1981 | 
| 2 | 3  | 01/01/2001 | 
| 5 | 1  | 11/11/2011 | 
| 5 | 2  | 10/10/2010 | 

我想這個結果集(僅適用於最新的):

----------------------------------- 
| C.Id | R.Rating | R.CreatedDate | 
----------------------------------- 
| 2 | 3  | 01/01/2001 | 
| 5 | 1  | 11/11/2011 | 

這是一個非常大的數據集,我的方法(我就不提了這所以沒有偏差)是這樣做很慢。關於如何獲得這個集合的任何想法?它不一定是一個單一的查詢,這是在一個存儲過程。

謝謝!

+2

請用您正在使用的數據庫標記您的問題。 – 2015-02-05 16:09:12

回答

1

你需要一個CTE與ROW_NUMBER():

WITH CTE AS (
SELECT ID, Rating, CreatedDate, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY CreatedDate DESC) RowID 
FROM [TABLESWITHJOIN] 
) 
SELECT * 
FROM CTE 
WHERE RowID = 1; 
1

您可以使用row_number()

select t.* 
from (select t.*, 
      row_number() over (partition by id order by createddate desc) as seqnum 
     from table t 
    ) t 
where seqnum = 1; 
+1

我寫了一個答案,但答案彈出之前,我完成了,這裏是一個提供數據和您的查詢的SQL小提琴:http://sqlfiddle.com/#!6/f0aab/1如果你想使用它 – Tanner 2015-02-05 16:31:17

+0

這些都是正確,謝謝!我的查詢刪除了30秒! – naspinski 2015-02-05 17:48:30

1

如果您使用的是SQL Server 2008或更高,你應該考慮使用窗口函數。例如:

select ID, Rating, CreatedDate from (
    select ID, Rating, CreatedDate, 
     rowseq=ROW_NUMBER() over (partition by ID order by CreatedDate desc) 
    from MyTable 
) x 
where rowseq = 1 

另外,請大家明白,雖然這是在其本身和高效的查詢,您的整體表現更在很大程度上取決於基礎表上,尤其是指標,並解釋所使用的計劃當首先加入表格時,等等。

+0

這些都是正確的,謝謝!我的查詢刪除了30秒! – naspinski 2015-02-05 17:47:47

相關問題