2013-05-21 32 views
2

與可能非常簡單的問題展開鬥爭。我有這樣一個查詢:T-SQL:按列列出最多n條記錄

;WITH rankedData 
     AS (-- a big, complex subquery) 
    SELECT UserId, 
     AttributeId, 
     ItemId 
    FROM rankedData 
    WHERE rank = 1 
    ORDER BY datEventDate DESC 

子查詢的目的是搶隔行數據的一大塊,並通過的itemId和日期排序,所以,在上面的查詢秩= 1,確保我們只得到獨特的ItemIds,按日期排序。分區是:

Rank() OVER (partition BY ItemId ORDER BY datEventDate DESC) AS rk 

的問題是什麼,我要的是前75的記錄每一個用戶名,按日期排序。由於我已經在我的子查詢中獲得了一個排序來按日期排序項目重複,所以我看不到這樣做的簡單方法。

乾杯, 馬特

回答

5

我覺得您的查詢應該像

SELECT t.UserId, t.AttributeId, t.ItemId 
FROM (
SELECT UserId, AttributeId, ItemId, rowid = ROW_NUMBER() OVER (
     PARTITION BY UserId ORDER BY datEventDate 
     ) 
FROM rankedData 
) t 
WHERE t.rowid <= 75 
+0

如果我理解正確OP他需要'每user' 75強唯一Itemids。 – Kaf

+0

@Kaf,因爲這個查詢使用了CTE'rankingData'我相信這將會發生。或者說,從唯一列表中選擇這些行。但想一想,你可能有一點。只有OP會知道。 –

+0

@MikaelEriksson:我明白你的意思了。謝謝。 OP中的用戶有一點誤解值得一提。用戶認爲**在上述查詢中「rank = 1確保我們只獲得唯一的ItemIds」**,但情況並非如此。我認爲他需要'row_number()'而不是'cte'中的rank()。 – Kaf