Финальный результат:

Запрос ищет максимальный перерыв между соседними заказами каждого клиента и оставляет клиентов с перерывом больше 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 проверить нельзя; запрос описывает именно требуемый расчёт.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее