Запрос ищет максимальный перерыв между соседними заказами каждого клиента и оставляет клиентов с перерывом больше 60 дней. В SQL Server вычисление gap нужно вынести в отдельный CTE.
Финальный результат:
Запрос ищет максимальный перерыв между соседними заказами каждого клиента и оставляет клиентов с перерывом больше 60 дней. В SQL Server вычисление gap нужно вынести в отдельный CTE.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Финальный результат:
| customer_id | gap_days |
|---|---|
| 1 | 123 |
| 2 | 120 |
with cte as( select order_id, customer_id, order_dt, lag(order_dt) over(partition by customer_id order by order_dt) as prev_order_ft, datediff(day, prev_order_ft, order_dt) as gap_days from Orders ) select customer_id, max(gap_days) as gap_days from cte where gap_days > 60 group by customer_id
Ответ
Запрос ищет максимальный перерыв между соседними заказами каждого клиента и оставляет клиентов с перерывом больше 60 дней. В SQL Server вычисление gap нужно вынести в отдельный CTE.
WITH previous_orders AS (
SELECT order_id, customer_id, order_dt,
LAG(order_dt) OVER (
PARTITION BY customer_id ORDER BY order_dt, order_id
) AS previous_dt
FROM Orders
), gaps AS (
SELECT customer_id, DATEDIFF(day, previous_dt, order_dt) AS gap_days
FROM previous_orders
)
SELECT customer_id, MAX(gap_days) AS gap_days
FROM gaps
GROUP BY customer_id
HAVING MAX(gap_days) > 60;
В SQL Server нельзя сослаться на алиас prev_order_ft в соседнем выражении того же SELECT. Первый заказ не имеет предыдущего и даёт NULL. DATEDIFF(day) считает границы календарных дней. Числа 123 и 120 без исходных Orders проверить нельзя; запрос описывает именно требуемый расчёт.