2012-06-07 156 views
5

我有一個三列表:A,B,C每組選擇第一行

的值是:

+---+-----+----+ 
| A | B | C | 
+---+-----+----+ 
| 1 | -10 | 5 | 
| 1 | 0 | 5 | 
| 1 | 10 | 5 | 
| 2 | 10 | 12 | 
| 2 | 0 | 12 | 
| 3 | -10 | 14 | 
| 4 | 0 | 8 | 
| 4 | 10 | 8 | 
| 5 | 0 | 6 | 
| 5 | 1 | 6 | 
| 5 | -5 | 6 | 
+---+-----+----+ 

如果我第一次訂購由列A,然後列B數據,然後列C(雖然我沒有讓所有列C值每列A值相同)會怎樣我選擇「第一行」每列A

所以,這將導致:

+---+-----+----+ 
| A | B | C | 
+---+-----+----+ 
| 1 | -10 | 5 | 
| 2 | 0 | 12 | 
| 3 | -10 | 14 | 
| 4 | 0 | 8 | 
| 5 | -5 | 6 | 
+---+-----+----+ 
+0

最後一個應該是{5,-5,6} – Kshitij

+0

固定........... – mezamorphic

+0

dba.stackexchange.com上還有一個詳細的答案:[每n次檢索n行組](http://dba.stackexchange.com/q/86415/57105)與不同方法的比較。 –

回答

14
SELECT a, b, c 
FROM (
     SELECT *, ROW_NUMBER() OVER (PARTITION BY a ORDER BY b, c) rn 
     FROM mytable 
     ) q 
WHERE rn = 1 
ORDER BY 
     a 

SELECT mi.* 
FROM (
     SELECT DISTINCT a 
     FROM mytable 
     ) md 
CROSS APPLY 
     (
     SELECT TOP 1 * 
     FROM mytable mi 
     WHERE mi.a = md.a 
     ORDER BY 
       b, c 
     ) mi 
ORDER BY 
     a 

(a, b, c)創建一個綜合指數的查詢速度更快的工作。

哪一個更有效取決於您的數據分佈。

如果你有幾個不同的值a但每個a內有很多記錄,第二個查詢會更好。

你可以更通過創建一個索引視圖改進:

CREATE VIEW v_mytable_da 
WITH SCHEMABINDING 
AS 
     SELECT a, COUNT_BIG(*) cnt 
     FROM dbo.mytable 
     GROUP BY 
       a 

GO 

CREATE UNIQUE CLUSTERED INDEX 
     pk_vmytableda_a 
ON  v_mytable_da (a) 

GO 

SELECT mi.* 
FROM v_mytable_da md 
CROSS APPLY 
     (
     SELECT TOP 1 * 
     FROM mytable mi 
     WHERE mi.a = md.a 
     ORDER BY 
       b, c 
     ) mi 
ORDER BY 
     a 
+0

非常感謝你!愛你的第一個答案 – mezamorphic

+0

有一個輕微的問題,我用這個代碼是一個函數,返回一個表...但它不會讓我包括ORDER BY語句....編輯:這是好的我已經使用過程 – mezamorphic

+0

@Porcupine:'ORDER BY'在函數內部沒有任何意義。你應該在查詢的末尾附加'ORDER BY',使用函數:'SELECT * FROM myfunction(2)ORDER BY a'。如果證明有效,Optimizer會將其推入查詢中。 – Quassnoi

0
SELECT * 
FROM 
    (SELECT *, 
      ROW_NUMBER() OVER (PARTITION BY Dealld 
          ORDER BY Price, Dealld) rn 
    FROM DealOffers) q 
WHERE rn = 1 
ORDER BY Name 
+2

請編輯更多信息。僅限代碼和「嘗試這個」的答案是不鼓勵的,因爲它們不包含可搜索的內容,也不解釋爲什麼有人應該「嘗試這個」。我們在這裏努力成爲知識的資源。 – abarisone