2012-04-11 64 views
1

我有一種情況,我需要根據表中的設置和序號集僅顯示最上面的行。根據序數和屬性數據選擇前n條記錄

下面的示例數據集顯示了兩個客戶;每個客戶都有不同的產品。 由於NumRowsToShow是「1」我只想爲每個客戶顯示一行(基於序數的最上一行)。

| CustomerID | ProductID | Ordinal | NumRowsToShow | 
+------------+-----------+---------+---------------+ 
| 1   |A   |1  |1    | 
| 1   |B   |2  |1    | 
| 1   |C   |3  |1    | 
| 5   |D   |1  |1    | 
| 5   |E   |2  |1    | 
| 5   |F   |3  |1    | 

查詢後的結果集運行應該是

| CustomerID | ProductID | 
+------------+-----------+ 
| 1   |A   | 
| 5   |D   | 

在相同的情況下,如果NumRowsToShow是1對CustomerID,1和2對CustomerID,5我會看到類似。

| CustomerID | ProductID | Ordinal | NumRowsToShow | 
+------------+-----------+---------+---------------+ 
| 1   |A   |1  |1    | 
| 1   |B   |2  |1    | 
| 1   |C   |3  |1    | 
| 5   |D   |1  |2    | 
| 5   |E   |2  |2    | 
| 5   |F   |3  |2    | 

結果查詢之後設定的運行應該是

| CustomerID | ProductID | 
+------------+-----------+ 
| 1   |A   | 
| 5   |D   | 
| 5   |E   | 

如何才能做到這一點?

包括實際結果集的屏幕截圖,其中突出顯示了我想要篩選的內容,但可能會對您有所幫助。

Screencap http://www.harpernet.net/se/cap01.jpg

+1

如果什麼客戶的行有三個不同的'NumRowsToShow'(比如1,2,3 )? – 2012-04-11 18:56:30

+0

那不會發生; NumRowsToShow來自每個CustomerID的設置。一樣的。這是幾個查詢的結果。客戶/產品ID不是實際的結果集,我只是試圖提供一個簡單的例子,我試圖過濾掉。 – sugarcrum 2012-04-11 19:23:59

回答

6

感覺就像 「作弊在考試中」:

SELECT CustomerID, ProductID 
FROM tableX 
WHERE Ordinal <= NumRowsToShow 

如果作爲意見建議,在Ordinal可以有10, 20, 30值,並且不僅1, ..., n值,那麼這將工作:

SELECT t.CustomerID, t.ProductID 
FROM tableX AS t 
    JOIN tableX AS tt 
    ON tt.CustomerID = t.CustomerID 
    AND tt.Ordinal <= t.Ordinal 
GROUP BY t.CustomerID 
     , t.ProductID 
     , t.NumRowsToShow 
HAVING COUNT(*) <= t.NumRowsToShow 

甚至更​​好,則:

SELECT CustomerID, ProductID 
FROM 
    (SELECT CustomerID, ProductID, NumRowsToShow 
     , ROW_NUMBER() OVER(PARTITION BY CustomerID 
           ORDER BY Ordinal 
          ) AS Rn 
    FROM tableX 
) AS tmp 
WHERE Rn <= NumRowsToShow ; 

試驗:SQL-Fiddle


您的表看起來是不歸。 NumRowsToShow列有重複的信息,可能會導致更新異常。這:

| CustomerID | ProductID | Ordinal | NumRowsToShow | 
+------------+-----------+---------+---------------+ 
| 1   |A   |1  |1    | 
| 1   |B   |2  |1    | 
| 1   |C   |3  |1    | 
| 5   |D   |1  |2    | 
| 5   |E   |2  |2    | 
| 5   |F   |3  |2    | 

可以歸到2個表:

| CustomerID | ProductID | Ordinal | 
+------------+-----------+---------+ 
| 1   |A   |1  | 
| 1   |B   |2  | 
| 1   |C   |3  | 
| 5   |D   |1  | 
| 5   |E   |2  | 
| 5   |F   |3  | 

和:

| CustomerID | NumRowsToShow | 
+------------+---------------+ 
| 1   |1    | 
| 5   |2    | 
+0

該表是另一個查詢的結果;這只是作爲我嘗試過濾的結果數據集的一個簡單示例。我喜歡Ordinal <= NumRowsToShow的簡單方法。它幾乎可行,除了「序數」可能是10,20,30 ..不一定是1,2,3。 – sugarcrum 2012-04-11 19:22:32

+0

非常感謝您花時間回覆。分區聲明正是我所期待的。我正在走這條路,但無法找到構建它的正確方法。非常非常感謝您的幫助。 – sugarcrum 2012-04-11 19:40:37

相關問題