Выбор наибольших и наименьших значений при группировке в sql

Есть следующие данные:

ID  sum ind
1   5   A
1   4   B
1   3   C
1   2   D
2   5   A
2   5   B
2   3   C
3   5   A
3   4   B
3   3   C
3   3   D

Необходимо для каждого ID выбрать наибольшую и наименьшую sum и их ind Если значений несколько, то выбираем первый по алфавиту, то есть на выходе необходимо получить

ID  sum ind
1   5   A
1   2   D
2   5   A
2   3   C
3   5   A
3   3   C

Код пишется в MS SQL

Залил данные :


Ответы (1 шт):

Автор решения: Roman Konoval

С использование аналитической функции:

select id, sum, ind 
from (
   select *,
       rank() over (partition by ID order by sum asc, ind asc) as asc_rank,
       rank() over (partition by ID order by sum desc, ind asc) as desc_rank
   from mytable) as m 
where asc_rank = 1 or desc_rank = 1;

Этот запрос вернет несколько записей, если у нас, скажем, есть еще одна запись с sum=5 и ind=A. Если нужно чтоб возвращалась только одна, то нужно заменить rank() на row_number().

→ Ссылка