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.