Добавить в корзинуПозвонить
Найти в Дзене

Пример использования оконной функции

Приведу пример использования оконной функции `ROW_NUMBER()` в PostgreSQL. Нам дана таблица `orders` с информацией о заказах: +----+----------+--------+
| id | customer | amount |
+----+----------+--------+
| 1 | Иванов | 100 |
| 2 | Иванов | 200 |
| 3 | Петров | 50 |
| 4 | Иванов | 300 |
| 5 | Петров | 150 |
+----+----------+--------+ Мы хотим присвоить уникальный номер каждому заказу каждого клиента, чтобы можно было отслеживать историю заказов. Мы можем использовать оконную функцию `ROW_NUMBER()` для этого: SELECT id, customer, amount,
ROW_NUMBER() OVER (PARTITION BY customer ORDER BY id) AS row_num
FROM orders; Результат: +----+----------+--------+---------+
| id | customer | amount | row_num |
+----+----------+--------+---------+
| 1 | Иванов | 100 | 1 |
| 2 | Иванов | 200 | 2 |
| 4 | Иванов | 300 | 3 |
| 3 | Петров | 50 | 1 |
| 5 | Петров | 150 | 2 |
+----+----------+--------+---------+
Как

Приведу пример использования оконной функции `ROW_NUMBER()` в PostgreSQL.

Нам дана таблица `orders` с информацией о заказах:

+----+----------+--------+
| id | customer | amount |
+----+----------+--------+
| 1 | Иванов | 100 |
| 2 | Иванов | 200 |
| 3 | Петров | 50 |
| 4 | Иванов | 300 |
| 5 | Петров | 150 |
+----+----------+--------+

Мы хотим присвоить уникальный номер каждому заказу каждого клиента, чтобы можно было отслеживать историю заказов.

Мы можем использовать оконную функцию `ROW_NUMBER()` для этого:

SELECT id, customer, amount,
ROW_NUMBER() OVER (PARTITION BY customer ORDER BY id) AS row_num
FROM orders;

Результат:

+----+----------+--------+---------+
| id | customer | amount | row_num |
+----+----------+--------+---------+
| 1 | Иванов | 100 | 1 |
| 2 | Иванов | 200 | 2 |
| 4 | Иванов | 300 | 3 |
| 3 | Петров | 50 | 1 |
| 5 | Петров | 150 | 2 |
+----+----------+--------+---------+
Как видите, оконная функция `ROW_NUMBER()` присвоила уникальный номер каждому заказу каждого клиента.

Мы также можем использовать оконную функцию `RANK()` для ранжирования заказов каждого клиента по сумме:

SELECT id, customer, amount,
RANK() OVER (PARTITION BY customer ORDER BY amount DESC) AS rank
FROM orders;

Результат:
+----+----------+--------+------+
| id | customer | amount | rank |
+----+----------+--------+------+
| 4 | Иванов | 300 | 1 |
| 2 | Иванов | 200 | 2 |
| 1 | Иванов | 100 | 3 |
| 5 | Петров | 150 | 1 |
| 3 | Петров | 50 | 2 |
+----+----------+--------+------+

Как видите, оконная функция `RANK()` ранжировала заказы каждого клиента по сумме.