Давай научимся нумеровать товары в рамках категории. Примерно так:
# | category_name | position | product_name |
---|---|---|---|
1 | Бытовая техника | 1 | Пылесос S6 |
2 | Бытовая техника | 2 | Холодильник A2 |
3 | Игровые консоли | 1 | Nintendo |
4 | Игровые консоли | 2 | PlayStation |
5 | Игровые консоли | 3 | Xbox |
... | ... | ... | ... |
Мы умеем делать сквозную нумерацию через 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_id | category_name | position | product_name |
---|---|---|---|---|
1 | 7 | Аудиотехника | 1 | Наушники S3 |
2 | 3 | Бытовая техника | 1 | Пылесос S6 |
3 | 3 | Бытовая техника | 2 | Холодильник A2 |
4 | 6 | Игровые консоли | 1 | Nintendo |
5 | 6 | Игровые консоли | 2 | PlayStation |
6 | 6 | Игровые консоли | 3 | Xbox |
7 | 9 | Ноутбуки | 1 | Ультрабук X5 |
8 | 10 | Рюкзаки | 1 | Deepbox |
9 | 8 | Сотовые телефоны | 1 | Моноблок C4 |
10 | 8 | Сотовые телефоны | 2 | Слайдер B3 |
11 | 5 | Фотоаппараты | 1 | Lord Nikon 95 |
12 | 5 | Фотоаппараты | 2 | Nikon D750 |
Как работает PARTITION BY
PARTITION BY
работает в оконных функциях так же, как и GROUP BY
в агрегатных.
Для вычисления оконной функции все строки запроса разбиваются на группы с одинаковыми значениями полей, перечисленных после PARTITION BY
.
У нас PARTITION BY c.category_id
, следовательно row_number()
вычисляется независимо для следующих наборов строк:
# | category_id | category_name | product_name |
---|---|---|---|
1 | 7 | Аудиотехника | Наушники S3 |
# | category_id | category_name | product_name |
---|---|---|---|
2 | 3 | Бытовая техника | Пылесос S6 |
3 | 3 | Бытовая техника | Холодильник A2 |
# | category_id | category_name | product_name |
---|---|---|---|
4 | 6 | Игровые консоли | Nintendo |
5 | 6 | Игровые консоли | PlayStation |
6 | 6 | Игровые консоли | Xbox |
# | category_id | category_name | product_name |
---|---|---|---|
7 | 9 | Ноутбуки | Ультрабук X5 |
# | category_id | category_name | product_name |
---|---|---|---|
8 | 10 | Рюкзаки | Deepbox |
# | category_id | category_name | product_name |
---|---|---|---|
9 | 8 | Сотовые телефоны | Моноблок C4 |
10 | 8 | Сотовые телефоны | Слайдер B3 |
# | category_id | category_name | product_name |
---|---|---|---|
11 | 5 | Фотоаппараты | Lord Nikon 95 |
12 | 5 | Фотоаппараты | Nikon D750 |
Затем в каждой группе строки сортируются по p.name
и получают свой порядковый номер функцией row_number()
.