NTILE
Делит строки раздела окна на заданное количество групп примерно равного размера и возвращает номер группы строки.
MySQL 8.1
NTILE(number_of_groups) OVER ([PARTITION BY ...] [ORDER BY ...])Параметры
- number_of_groupsINT
- Количество групп, положительное целое число
- PARTITION BYнеобязательный
- Столбцы, по которым строки делятся на разделы, группы считаются в каждом разделе отдельно
- ORDER BYнеобязательный
- Порядок, в котором строки распределяются по группам; без него распределение произвольное
Возвращаемое значение
Целое число (BIGINT UNSIGNED) от 1 до number_of_groups
Примеры
Три группы по дате рождения
MySQL 8.1
SELECT member_name,
birthday,
NTILE(3) OVER (
ORDER BY birthday
) AS age_group
FROM FamilyMembers;Границы четвертей по сумме заказа
MySQL 8.1
SELECT bucket,
MIN(total_amount) AS min_amount,
MAX(total_amount) AS max_amount,
COUNT(*) AS orders
FROM (
SELECT total_amount,
NTILE(4) OVER (
ORDER BY total_amount
) AS bucket
FROM orders
) AS t
GROUP BY bucket
ORDER BY bucket;Подробности
Если строки не делятся поровну, первые группы получают на одну строку больше: 8 строк на 3 группы делятся как 3, 3 и 2. Если групп больше, чем строк, каждая строка попадает в свою группу. Строки с одинаковым значением ORDER BY могут оказаться в разных группах.