2016-11-27 3 views
0

Предположим, что я хочу выбрать из таблицы ABC, содержащей поля A, B, C, D, E, где E - числовое поле.GROUP BY небольшим подмножеством возвращаемых полей

Для данной комбинации A и B Я хочу вернуть строку, содержащую максимальное значение E. Как мне это сделать? Что мне делать GROUP BY?

Если я пытаюсь выполнить GROUP с помощью A, B при размещении max только вокруг E, я получаю ошибку «not a GROUP BY expression», но я хочу GROUP только A, B.

Я попытался

select A,B,C,D,max(E) 
from ABC 
group by A,B 

и это не работает.

ответ

1

Это не требует group by. Типичный способ:

select abc.* 
from abc 
where abc.e = (select max(abc2.e) from abc abc2 where abc.a = abc2.a and abc.b = abc2.a); 

Однако, это будет возвращать дубликаты, если несколько строк имеют одинаковую максимальную e значение. Другой метод использует стандарт ANSI окна функции:

select abc.* 
from (select abc.*, 
      row_number() over (partition by a, b order by e desc) as seqnum 
     from abc 
    ) abc 
where seqnum = 1; 

Это возвращает один (произвольный) строку, если есть повторяющиеся максимальные e значения. Вы можете использовать rank() или dense_rank() вместо row_number(), если вы хотите дублировать этот метод.

+0

Какой из этих двух будет работать лучше? Есть ли способ избавиться от промежуточной таблицы, содержащей столбец row_number(), и вместо этого выбрать требуемые строки для каждой комбинации A и B, используя только предложение WHERE на ABC в исходном запросе? Другими словами, можно ли интегрировать PARTITION и сбор требуемой строки с предложением WHERE? – user2371765

+0

Я предпочитаю что-то вроде этого. выберите * от ABC, где rank() over (раздел (ABC.A , ABC.B ) заказ от ABC.E) = 1 Для этого я получаю сообщение об ошибке, «функции окна здесь запрещены». – user2371765

1
select t1.* 
from ABC t1 
join 
(
    select A,B,max(E) as maxE 
    from ABC 
    group by A,B 
) t2 on t1.a = t2.a and t1.b = t2.b and t1.e = t2.maxE 
+0

Это работает, но есть ли способ избежать объединений и вложенных запросов? PARTITION - один из способов - например. – user2371765

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