Справочник по функциям

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;
member_namebirthdayage_group
Headley Quincey1960-05-131
Ernest Forrest1961-09-111
Flavia Quincey1963-02-161
Constance Forrest1968-09-062
Andie Quincey1983-06-052
Lela Quincey1985-06-072
Annie Quincey1988-04-103
Wednesday Addams2005-01-133

Границы четвертей по сумме заказа

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;
bucketmin_amountmax_amountorders
11.995.97114
25.989.97114
39.9820.97114
421.2999.96114

Подробности

Если строки не делятся поровну, первые группы получают на одну строку больше: 8 строк на 3 группы делятся как 3, 3 и 2. Если групп больше, чем строк, каждая строка попадает в свою группу. Строки с одинаковым значением ORDER BY могут оказаться в разных группах.

Смотрите также