Чтобы найти пропуски в последовательности последовательных чисел, существует два основных подхода в SQL: использование оконных функций или self-join.
Самый эффективный метод использует LEAD() для сравнения каждой строки со следующей:
SELECT
id + 1 AS gap_start,
LEAD(id) OVER (ORDER BY id) - 1 AS gap_end
FROM table_name
WHERE LEAD(id) OVER (ORDER BY id) - id > 1;
LEAD(id) получает значение следующей строки в упорядоченной последовательностиWHERE фильтрует только строки, где разница больше 1, что указывает на пропускgap_start и gap_end определяют точный диапазон недостающих значенийSelf-join может дать тот же результат без оконных функций, что полезно для более старых СУБД:
SELECT
a.id + 1 AS gap_start,
MIN(b.id) - 1 AS gap_end
FROM table_name a
JOIN table_name b ON b.id > a.id
GROUP BY a.id
HAVING a.id + 1 < MIN(b.id);
HAVING гарантирует, что возвращаются только реальные пропускиОконная функция LEAD() получает значение следующей строки в упорядоченной последовательности, позволяя тебе сравнивать последовательные значения для выявления пропусков больше 1.
Новый — ещё не проверен сообществом
Вы