Описание : в этой статьи вы узнаете, как использовать функцию NTILE() в MySQL для разделения строк на определенное количество групп.
Функция NTILE() делит строки в отсортированном разделе на определенное количество групп. Каждой группе присваивается номер сегмента, начинающийся с единицы. Для каждой строки функция NTILE() возвращает номер сегмента, представляющий группу, к которой принадлежит строка.
Ниже показан синтаксис функции NTILE():
NTILE(n) OVER ( PARTITION BY <expression>[{,<expression>...}] ORDER BY <expression> [ASC|DESC], [{,<expression>...}] )
В этом синтаксисе:
Обратите внимание, что если количество строк раздела не делится на n, функция NTILE() приведет к группам двух размеров с разницей в один. Большие группы всегда располагаются перед меньшей группой в порядке, указанном в предложении ORDER BY.
С другой стороны, если общее количество строк раздела кратно n, строки будут равномерно распределены по группам.
Посмотрите следующую таблицу, в которой хранятся девять целых чисел от одного до девяти:
CREATE TABLE t ( val INT NOT NULL ); INSERT INTOt(val) VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9); SELECT * FROM t;
Если вы используете функцию NTILE() для разделения девяти строк на четыре группы, вы окажетесь в первой группе с тремя строками, а остальные три группы с четырьмя строками.
Смотрите следующую демонстрацию:
SELECT val, NTILE (4) OVER ( ORDER BY val ) bucket_no FROM t;
Вот вывод:
Как видно из выходных данных, первая группа имеет три строки, в то время как другие группы имеют две строки.
Давайте изменим количество групп с четырех до трех, как показано в следующем запросе:
SELECT val, NTILE (3) OVER ( ORDER BY val ) bucket_no FROM t;
В результирующем наборе теперь есть три группы с одинаковым количеством строк.
Мы будем использовать таблицы orders, orderDetails и products из базы данных для демонстрации.
Смотрите следующий запрос:
WITH productline_sales AS ( SELECT productline, year(orderDate) order_year, ROUND(SUM(quantityOrdered * priceEach),0) order_value FROM orders INNER JOIN orderdetails USING (orderNumber) INNER JOIN products USING (productCode) GROUP BY productline, order_year ) SELECT productline, order_year, order_value, NTILE(3) OVER ( PARTITION BY order_year ORDER BY order_value DESC ) product_line_group FROM productline_sales;
В этом примере:
Вывод:
Из этой статьи вы узнали, как использовать функцию NTILE() в MySQL для распределения строк по указанному количеству групп.