Функция ntile(количество_групп)
разделяет результирующий набор на указанное количество групп.
Разобьем проданные товары на три группы по количеству проданных единиц товара:
SELECT pi.product_id,
sum (pi.count) AS count_total,
ntile(3) over (ORDER BY sum(pi.count) desc)
FROM purchase_item pi
GROUP BY pi.product_id
# | product_id | count_total | ntile |
---|---|---|---|
1 | 2 | 35 | 1 |
2 | 8 | 6 | 1 |
3 | 3 | 2 | 1 |
4 | 5 | 2 | 1 |
5 | 10 | 2 | 2 |
6 | 9 | 2 | 2 |
7 | 6 | 1 | 2 |
8 | 11 | 1 | 2 |
9 | 7 | 1 | 3 |
10 | 12 | 1 | 3 |
11 | 4 | 1 | 3 |
Как вычисляется ntile
для строки?
Шаг 1. Результат запроса сортируется по условию, указанному в ORDER BY
внутри over
функции ntile
.
Шаг 2. Отсортированные строки равномерно делятся на количество указанных групп.
Если количество строк не делится целочисленно на количество групп, то в первых группах будет больше на одну строку. В нашем примере 11 строк и 3 группы. Следовательно в первой группе будет 4 строки, во второй - 4 строки, а в третьей - 3.