Поиск пропущенного значения в числовой последовательности SQL-запросом

4. Поиск пропущенного значения в числовой последовательности SQL-запросом

Условие задачи:
Написать SQL-запрос, который находит пропущенные значения в числовой последовательности.
Например, если в данных есть значения 1, 2, 3, 5, запрос должен определить, что пропущено значение 4.
Запрос должен находить отсутствующие числа внутри последовательности на основе имеющихся значений в таблице.

Спойлеры к решению
Подсказки
  • Нужно найти минимальное и максимальное значение в существующей последовательности.
  • Затем нужно сгенерировать полный диапазон чисел от MIN(value) до MAX(value).
  • После этого сравнить полный диапазон с реальными значениями из таблицы.
  • Числа, которых нет в исходной таблице, и будут пропущенными.
  • В PostgreSQL удобно использовать функцию generate_series().
Решение
SELECT gs.number AS missing_number
FROM generate_series(
    (SELECT MIN(value) FROM numbers),
    (SELECT MAX(value) FROM numbers)
) AS gs(number)
LEFT JOIN numbers n ON n.value = gs.number
WHERE n.value IS NULL;

Этот SQL-запрос находит пропущенные числа внутри последовательности. Например, если в таблице numbers есть значения 1, 2, 3, 5, то generate_series() создаст полный ряд 1, 2, 3, 4, 5, а LEFT JOIN покажет, что значения 4 нет в таблице.

Здесь предполагается, что таблица называется numbers, а числовое поле — value.