Оконные функции

Номер строки в рамках группы

Давай научимся нумеровать товары в рамках категории. Примерно так:

#category_namepositionproduct_name
1Бытовая техника1Пылесос S6
2Бытовая техника2Холодильник A2
3Игровые консоли1Nintendo
4Игровые консоли2PlayStation
5Игровые консоли3Xbox
............

Мы умеем делать сквозную нумерацию через row_number(). Чтобы сделать отдельную нумерацию в рамках категории, достаточно в OVER добавить разбивку по категориям через PARTITION BY:

SELECT c.category_id,
       c.name AS category_name,
       row_number () OVER (PARTITION BY c.category_id ORDER BY p.name) AS position,
       p.name AS product_name
  FROM category c,
       product p
 WHERE p.category_id = c.category_id
 ORDER BY c.name, position
#category_idcategory_namepositionproduct_name
17Аудиотехника1Наушники S3
23Бытовая техника1Пылесос S6
33Бытовая техника2Холодильник A2
46Игровые консоли1Nintendo
56Игровые консоли2PlayStation
66Игровые консоли3Xbox
79Ноутбуки1Ультрабук X5
810Рюкзаки1Deepbox
98Сотовые телефоны1Моноблок C4
108Сотовые телефоны2Слайдер B3
115Фотоаппараты1Lord Nikon 95
125Фотоаппараты2Nikon D750

Как работает PARTITION BY

PARTITION BY работает в оконных функциях так же, как и GROUP BY в агрегатных.

Для вычисления оконной функции все строки запроса разбиваются на группы с одинаковыми значениями полей, перечисленных после PARTITION BY.

У нас PARTITION BY c.category_id, следовательно row_number() вычисляется независимо для следующих наборов строк:

#category_idcategory_nameproduct_name
17АудиотехникаНаушники S3
#category_idcategory_nameproduct_name
23Бытовая техникаПылесос S6
33Бытовая техникаХолодильник A2
#category_idcategory_nameproduct_name
46Игровые консолиNintendo
56Игровые консолиPlayStation
66Игровые консолиXbox
#category_idcategory_nameproduct_name
79НоутбукиУльтрабук X5
#category_idcategory_nameproduct_name
810РюкзакиDeepbox
#category_idcategory_nameproduct_name
98Сотовые телефоныМоноблок C4
108Сотовые телефоныСлайдер B3
#category_idcategory_nameproduct_name
115ФотоаппаратыLord Nikon 95
125ФотоаппаратыNikon D750

Затем в каждой группе строки сортируются по p.name и получают свой порядковый номер функцией row_number().

ПредыдущаяСледующая