Оконные функции

WITHIN GROUP

Есть ряд агрегатных функций, которые похожи на оконные, но таковыми не являются.

ФункцияОписание
mode() WITHIN GROUP (ORDER BY выражение_сортировки)возвращает значение, наиболее часто встречающееся во входных данных (если одинаково часто встречаются несколько значений, произвольно выбирается первое из них)
percentile_cont(дробь) WITHIN GROUP (ORDER BY выражение_сортировки)непрерывный процентиль: возвращает значение, соответствующее заданной дроби по порядку, интерполируя соседние входные значения, если необходимо
percentile_disc(дробь) WITHIN GROUP (ORDER BY выражение_сортировки)дискретный процентиль: возвращает первое значение из входных данных, позиция которого по порядку равна или превосходит указанную дробь
rank(аргументы) WITHIN GROUP (ORDER BY сортированные_аргументы)ранг гипотетической строки, с пропусками повторяющихся строк
dense_rank(аргументы) WITHIN GROUP (ORDER BY сортированные_аргументы)ранг гипотетической строки, без пропусков
percent_rank(аргументы) WITHIN GROUP (ORDER BY сортированные_аргументы)относительный ранг гипотетической строки, от 0 до 1
cume_dist(аргументы) WITHIN GROUP (ORDER BY сортированные_аргументы)относительный ранг гипотетической строки, от 1/N до 1

Если после агрегатной функции отсутствует OVER, то функция не является оконной. Значит значение будет вычисляться в процессе группировки строк. Агрегатные функции, после которых написано WITHIN GROUP, не являются исключением.

Что такое WITHIN GROUP?

В WITHIN GROUP в ORDER BY указывается значение, по которому будет сформирован набор данных с указанием сортировки. Сейчас разберем все на примере.

Мода

В повседневной жизни мы часто встречаемся с модой. Модная одежда, модная прическа, модный дизайн... Но что значит быть модным?

В математике для моды есть четкое определение. Модой ряда чисел называется число, которое встречается в данном ряду чаще других. Модой ряда 32, 26, 18, 26, 15, 21, 26 является число 26, встречается 3 раза.

Найдем самого модного руководителя, т.е. того, у кого больше всего подчиненных :)

Сначала посмотрим исходные данные:

SELECT e.manager_id,
       count (*) AS cnt
  FROM employee e
 WHERE e.manager_id IS NOT NULL
 GROUP BY e.manager_id
 ORDER BY cnt DESC
#manager_idcnt
1244
253
3203
4233
5213
6162
.........

Найдем "самого модного":

SELECT mode() WITHIN GROUP (ORDER BY e.manager_id)
  FROM employee e
#mode
124

P.S. В теме про оконные функции у нас нет цели разобрать все агрегатные функции. Целью данного задания было познакомиться с WITHIN GROUP. Остальные вышеперечисленные функции разберем в отдельной теме.

ПредыдущаяСледующая