Найдите предыдущий заказ клиента через LAG, вычислите разницу дат и оставьте клиентов, чей максимальный разрыв превышает 60 дней.
Задача #3
Найдите предыдущий заказ клиента через LAG, вычислите разницу дат и оставьте клиентов, чей максимальный разрыв превышает 60 дней.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Задача #3 Нужно найти клиентов, у которых разрыв между их заказами > 60 дней. Для указанных клиентов вывести максимальный разрыв (gap_days).
Orders table:
| order_id | customer_id | order_dt |
|---|---|---|
| 1 | 1 | [phone] |
| 2 | 1 | [phone] |
| 3 | 1 | [phone] |
| 4 | 1 | [phone] |
| 5 | 2 | [phone] |
| 6 | 2 | [phone] |
| 7 | 3 | [phone] |
Финальный результат:
| customer_id | gap_days |
|---|---|
| 1 | 123 |
| 2 | 120 |
Ответ
Найдите предыдущий заказ клиента через LAG, вычислите разницу дат и оставьте клиентов, чей максимальный разрыв превышает 60 дней.
Для PostgreSQL, если order_dt имеет тип date:
WITH gaps AS (
SELECT customer_id,
order_dt - LAG(order_dt) OVER (
PARTITION BY customer_id
ORDER BY order_dt, order_id
) AS gap_days
FROM Orders
)
SELECT customer_id, MAX(gap_days) AS gap_days
FROM gaps
GROUP BY customer_id
HAVING MAX(gap_days) > 60;
Первый заказ даёт NULL и не влияет на MAX; клиент с одним заказом не попадёт в результат. В исходных данных даты заменены маркерами, поэтому конкретные значения 123 и 120 проверить нельзя, но запрос решает указанную задачу.