2012-06-13 6 views
1

Вот что мой стол TheTable выглядитSQL: частичная группа по

ColA | ColB | ColC 
------+-------+------ 
abc | 2005 | item7 
abc | 2010 | item3 
def | 2009 | item2 
def | 2010 | item4 
def | 2011 | item5 
def | 2012 | item1 

И я хочу написать запрос, чтобы вернуть этот результат:

ColA | ColB | ColC 
------+-------+------ 
abc | 2010 | item3 
def | 2012 | item1 

я закончил с:

SELECT TheTable.ColA,TheTable.ColB,TheTable.ColC 
FROM TheTable,(SELECT ColA a,MAX(ColB) b FROM TheTable GROUP BY ColA) t 
WHERE t.a=TheTable.ColA AND t.b=TheTable.ColB 

Но я не уверен, что такой вложенный запрос очень эффективен. Итак, вопрос в том, есть ли лучший способ?

+0

Ваши две другие колонки имеют оба значения MAX. Что произойдет, если вы добавите строку с 'def | 2008 | item7', а другой с 'def | 2012 | item3'? (Или измените последнее на '2013', если' ColA, ColB' уникален. –

+0

Порядок ColC не имеет значения. Я изменил пример, чтобы сделать его более ясным. – gregseth

ответ

3
WITH OrderedTable AS 
(
    SELECT ColA, ColB, ColC, 
     ROW_NUMBER() OVER (PARTITION BY ColA ORDER BY ColB DESC) AS Row 
    FROM TheTable 
) 
SELECT ColA, ColB, ColC FROM OrderedTable WHERE Row = 1 
+0

Хорошо спасибо. Каковы преимущества этого метода? – gregseth

+0

Ну, он выполняет только одно сканирование таблицы (для вас требуется два), а также гарантирует только один результат, когда ColA и ColB не уникальны, в то время как ваши будут генерировать повторяющиеся результаты, если данный ColA имеет более одной записи, разделяющей тот же Макс (ColB). запрос может все еще работать лучше в некоторых ситуациях - для моего требуется полная сортировка таблицы, которая (в зависимости от индексов и томов) может быть не совсем дружественной. – MartW