Оконная функция LAG() позволяет получить предыдущее значение в отсортированном наборе. Если
order_number - LAG(order_number) > 1, значит есть пропуск между предыдущим и текущим номером.Пример запроса:
sql
WITH gaps AS (
SELECT
LAG(order_number) OVER (ORDER BY order_number) AS prev_num,
order_number AS curr_num
FROM orders
)
SELECT (prev_num + 1) AS missing_start, (curr_num - 1) AS missing_end
FROM gaps
WHERE curr_num - prev_num > 1;
Почему другие варианты хуже:
B (LEFT JOIN с таблицей всех чисел) – требует генерации последовательности, что при больших диапазонах неэффективно.
C (GROUP BY) – не может найти пропуски без генерации всех значений.
D (NOT EXISTS) – потребует для каждого номера подзапрос, что медленно.
Реальный кейс: В интернет-магазине из-за ошибок в интеграции номера заказов иногда пропускались. Аналитик написал запрос с
LAG() и за 0.1 секунды нашёл все разрывы в таблице из 10 млн записей.Вывод:
LAG() – оптимальный инструмент для поиска пропусков в последовательностях без генерации вспомогательных таблиц.