SQL: Ранжирование заказов клиента
Условие
У вас есть таблица orders:
- order_id (integer)
- customer_id (integer)
- order_date (date)
- amount (decimal)
Для каждого заказа определите его порядковый номер для данного клиента и сравните с предыдущим заказом.
Ожидаемый результат:
Таблица с колонками: customer_id, order_id, order_date, amount, order_number, prev_order_amount, amount_change
Источник: задача на оконные функции
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Ранжирование и сравнение заказов SQL
SELECT customer_id, order_id, order_date, amount, ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY order_date) as order_number, LAG(amount) OVER (PARTITION BY customer_id ORDER BY order_date) as prev_order_amount, ROUND(amount - LAG(amount) OVER (PARTITION BY customer_id ORDER BY order_date), 2) as amount_change, ROUND(100.0 * (amount - LAG(amount) OVER (PARTITION BY customer_id ORDER BY order_date)) /
LAG(amount) OVER (PARTITION BY customer_id ORDER BY order_date), 1) as percent_change
FROM orders ORDER BY customer_id, order_date
Объяснение:
- ROW_NUMBER: порядковый номер заказа для клиента
- LAG: получаем сумму предыдущего заказа
- amount_change: разница между текущим и предыдущим заказом
- percent_change: процентное изменение (рост/падение чека)
Пример результата:
customer_id | order_id | amount | order_number | prev_amount | change | percent_change
1 | 100 | 50.00 | 1 | NULL | NULL | NULL
1 | 101 | 75.00 | 2 | 50.00 | 25.00 | 50.0
1 | 102 | 70.00 | 3 | 75.00 | -5.00 | -6.7
2 | 103 | 100.00 | 1 | NULL | NULL | NULL
2 | 104 | 110.00 | 2 | 100.00 | 10.00 | 10.0
Случаи использования:
- Анализ тренда среднего чека по клиентам
- Выявление клиентов с растущим чеком (рост продаж)
- Выявление чурна (падение суммы заказа перед уходом)
- LTV прогнозирование