2012-02-07 3 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

+0

+1, 't.count' является varchar. сделайте преобразование по сравнению с 'sub.ct'. –

+1

@aF. - хорошая точка зрения. Я действительно должен сделать CAST в подзапросе, так как написано '40> 300' – JNK

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()' может быть лучшим выбором, так как может быть несколько цветов с одинаковым максимальным количеством. –

+0

В чем разница? В конце концов, только первая строка берется в группе. Вы можете отрегулировать предложение ORDER BY, чтобы добавить приоритет для цветов для случая, когда счетчики совпадают. – pistipanko

+0

Если это было то, что вы предположили (* «только первая строка взята в группе» *), то, конечно, «ROW_NUMBER()» - это путь. Но если бы OP подразумевала включение всех вхождений верхнего счета из каждой группы, даже если некоторые группы содержали более одного, то 'ROW_NUMBER()' дал бы вам неполные результаты. –

Смежные вопросы