Разделение на группы - NTILE

Функция 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.

11.4 Несколько человек на место - DENSE_RANK

11.6 Агрегатные оконные функции