SQL Advanced-3-Sort и оконные функции
При использовании базы данных для получения различных статистических данных необходимо сортировать данные, например, по"Оценка, продажи, количество человек"Существует два вида методов сортировки:
- Рейтинг после пропуска
- Не пропускайте последующее ранжирование
оконная функция
Оконные функции работают только в последнихMySQL
Поддерживается только в версии!
Оконные функции работают только в последнихMySQL
Поддерживается только в версии!
Оконные функции работают только в последнихMySQL
Поддерживается только в версии!
Ссылка: https://zhuanlan.zhihu.com/p/92654574
что такое оконные функции
оконная функция, также называемаяOLAP
Функция (онлайн-аналитическая обработка, онлайн-аналитическая обработка), которая может выполнять аналитическую обработку данных базы данных в реальном времени.
грамматика
Основной синтаксис оконных функций:
<窗口函数> over (partition by <用于分组的字段名> -- partition子句可省略,不指定分组
order by <用于排序的列名>)
<窗口函数>
Есть два вида функций, которые могут быть размещены в позиции:
- специальные оконные функции,
rank、dense_rank、row_number
Ждать - Агрегатные функции, такие как
sum、avg、count、max、min
Ждать
Потому что оконная функция правильнаяwhere
илиgroup by
Результат обработки предложения обрабатывается, поэтому"В принципе, оконные функции могут быть записаны только в предложении select.".
Функции
- Он также имеет функцию группировки и сортировки
- Не изменять количество строк в исходной таблице
- В принципе, оконные функции могут быть написаны только на
select
в пункте
реальная сцена
- Проблема ранжирования: каждый отдел ранжируется по производительности
-
topN
Вопрос: Найдите высший ранг в каждом отделеN
сотрудники получают вознаграждение
rank/dense_rank/row_number
Пример
-
rank
: Рейтинг прыжков с ничьей -
dense_rank
: Ничья в последовательном рейтинге -
row_number
: Непрерывный рейтинг
Разницу между этими тремя функциями хорошо видно через колонку:
select
name,price,
rank() over (order by price desc) as rank_1,
dense_rank() (order by price desc) as rank_2,
row_number() (order by price desc) as rank_3
from products;
в заключении
name price rank_1 rank_2 rank_3
橘子 100 1 1 1
西瓜 80 2 2 2
苹果 50 3 3 3
香蕉 50 3 3 4
葡萄 50 3 3 5
柠檬 30 6 4 6
Суммировать:
-
rank()
После того, как появляется тот же ранг, тот же ранг пропускается -
dense_rank()
то такой же ранг не пропускается -
row_number()
Расположить в порядке натуральных чисел
❝В приведенных выше трех специальных оконных функциях круглые скобки после функции не нуждаются в каких-либо параметрах, просто оставьте () пустым.
❞
пример Чжиху
Реализовать ранг()
select *,
rank() over (partition by 班级 -- 先分组
order by 成绩 desc) as ranking -- 再排序
from 班级表
Не меняйте количество строк
Неэквивалентное соединение реализует rank()
select p1.name,p1.price,
(select count(p2.price)
from products p2
where p2.price > p1.price) + 1
as rank_1
from products
order by rank_1;
- Функция подзапроса состоит в том, чтобы вычислить отношение
(p1)
высокий рекорд и сделать его своим собственным рейтингом - Например, цена после дедупликации
{100,80,50}
Анализировать и сортировать, сравнивать100
Большее число равно 0, число больше 80 равно 1, а число больше 50 равно 2. -
+1
Рейтинг после этого - это то, что будет упомянуто ниже.dense_rank()
ранжирование функций
цена | ранжирование | +1 |
---|---|---|
100 | 0 | 1 |
80 | 1 | 2 |
50 | 2 | 3 |
"Если вы хотите, чтобы сортировка начиналась с 0, удалите и добавьте 1":
Неэквивалентное соединение реализует плотное_rank()
mysql> select p1.name, p1.price,
(select count(distinct p2.price) from products p2 where p2.price > p1.price) + 1 as rank_1
from products p1
order by rank_1;
Реализовать row_number() с использованием переменных
существуетMySQL5.7.28
реализация переменных вrow_number
функция функции
mysql> select p.name, p.price, (@pro_rank := @pro_rank + 1) row_Number
-> from products p,(select @pro_rank := 0) r
-> order by price desc;
если более продвинутыйMySQL
версия, использовать напрямуюrow_number()
реализация функции
select name, price,
row_number() over (partition by name order by price desc) as rowNumber
from products
Агрегатные функции как оконные функции
Агрегатная оконная функция точно такая же, как выделенная оконная функция, упомянутая выше, только нужно поместить"Агрегатная функция"Его можно записать в позиции оконной функции
- "Скобки после функции не могут быть пустыми"
- Вам нужно указать имя агрегированного столбца
требуется в продвинутомMySQL
версия илиhive
реализовано в
mysql> select *,
-> sum(price) over (order by name) as rank_sum,
-> avg(price) over (order by name) as rank_avg,
-> max(price) over (order by name) as rank_max,
-> count(price) over (order by name) as rank_count
-> from products;