2012-02-07 49 views
3

我有一個看起來像這樣的數據:抓住每組中具有最高價值的行?

Table 
Group: "A" , Color: "Blue", Count: "400" 
Group: "A" , Color: "Green", Count: "3" 
Group: "A" , Color: "Yellow", Count: "6" 
Group: "A" , Color: "Red", Count: "1" 
Group: "B" , Color: "Purple", Count: "243" 
Group: "B" , Color: "Green", Count: "2" 
Group: "B" , Color: "Yellow", Count: "7" 

我如何可以查詢這個數據獲得各組的最流行的(通過數)的顏色。所以,結果是這樣的:

回答

6
SELECT Group, Color 
FROM MyTable t 
INNER JOIN (SELECT Group, Max(CAST(Count as int)) as Ct 
      FROM MyTable 
      GROUP BY Group) Sub 
    ON sub.group = t.group 
    AND sub.ct = t.count 

順便說一句,不命名字段GROUP,或COUNT。他們是關鍵詞,會導致頭痛和心碎。

+1

+1:一個額外的*精神* +1對字段名稱註釋。 – MatBailie 2012-02-07 16:53:18

+0

+1,'t.count'是varchar。與'sub.ct'比較時進行轉換。 – 2012-02-07 16:53:55

+1

@aF。 - 好點子。我實際上應該在子查詢中做一個CAST,因爲寫成'40> 300' – JNK 2012-02-07 16:55:13

0

這也應該工作:

SELECT t.Group, 
      t.Color, 
      t.Count 
FROM  (SELECT Group, 
        Color, 
        Count, 
        ROW_NUMBER() OVER(PARTITION BY Group ORDER BY CAST(Count AS INT) DESC) AS num 
      FROM Table) AS t 
WHERE  t.num = 1 
+0

'RANK()'可能是更好的選擇,因爲可能有幾種顏色具有相同的最大數量。 – 2012-02-08 07:00:26

+0

有什麼區別?畢竟,只有第一行是在一個組中。當Counts相同時,您可以調整ORDER BY子句以爲大小寫的顏色添加優先級。 – pistipanko 2012-02-08 10:58:08

+0

如果這就是你所假設的(*'只有第一行是在一個組中取得的'),那麼當然''ROW_NUMBER()'是一種方法。但是,如果OP意味着包括所有組的最高數量的出現,即使某些組包含多個組,那麼'ROW_NUMBER()'會給你提供不完整的結果。 – 2012-02-08 13:53:08