2013-02-21 3 views
2

Мне нужно иметь возможность группировать по двум столбцам и возвращать только строку, где идентификатор другого столбца для этих двух столбцов является максимальным значением. Детали я после в четвертой колонке говорят, называется ответомГруппа по двум столбцам и макс другого столбца

COLUMN1 | COLUMN2 | NUMBERCOL | Answer 
--------------- ---------------------------- 
123 | 456 |  1  | a 
123 | 456 |  2  | x 
123 | 456 |  3  | s 
654 | 564 |  1  | a 
654 | 564 |  2  | s 
654 | 564 |  3  | p 
654 | 564 |  4  | b 

Так что мне нужно ответить s из первых результатов группирования и ответа б из второго группирования результатов

ответ

3

Вы можете использовать подзапрос с JOIN, чтобы получить результат:

select t1.column1, 
    t1.column2, 
    t1.numbercol, 
    t1.answer 
from yourtable t1 
inner join 
(
    select column1, column2, 
    max(numbercol) MaxNum 
    from yourtable 
    group by column1, column2 
) t2 
    on t1.column1 = t2.column1 
    and t1.column2 = t2.column2 
    and t1.numbercol = t2.MaxNum 

См SQL Fiddle with Demo

+0

Это прекрасно работает, приветствует, плюс не генерирует столбца seqnum. – Standage

+0

@Standage добро пожаловать, рад, что он работает. – Taryn

2

Вы можете использовать аналитические функции для этого :

select t.* 
from (select t.*, 
      row_number() over (partition by column1, column2 order by numbercol desc) as seqnum 
     from t 
    ) t 
where seqnum = 1 

Это работает не путем агрегирования данных, а путем назначения последовательного номера строкам. Последовательное число начинается заново для каждого нового значения (column1, column2), а порядок определяется numbercol. Наибольший номерcol получает значение 1, второе самое высокое 2 и так далее. Это пример аналитической функции в Oracle (называемой «оконной» функцией в других базах данных).

Заключительное предложение where выбирает нужную строку - ту, которая имеет самый высокий номер.

+0

+1 Хороший ответ - вот демо: http://sqlfiddle.com/#!4/6cedf/1 – sgeddes

+0

Приятно, что работает, зачем нужна последняя часть, где seqnum = 1? – Standage