@Us59

Как найти минимальное свободное значение в диапазоне?

Заданное число: 10

В столбце number записаны занятые значения:
10.000
10.001
10.002
10.003
10.005


Как узнать, сколько раз нужно к заданному числу прибавить по 0.001, чтобы найти number которого еще нет в таблице? Как составить SQL запрос?
  • Вопрос задан
  • 153 просмотра
Пригласить эксперта
Ответы на вопрос 2
@Akina
Сетевой и системный админ, SQL-программист.
Предполагая, что тип данных поля - DECIMAL(xx, 3):
SELECT MIN(value) + 0.001
FROM test t1
WHERE NOT EXISTS (
  SELECT NULL
  FROM test t2
  WHERE t1.value = t2.value - 0.001
  );


https://dbfiddle.uk/9Yyi-pol

PS. Возвращаемое значение не может быть меньше минимального из уже имеющихся в таблице.
Ответ написан
@alexalexes
WITH RECURSIVE
-- Тестовая выборка. Если есть "живая" таблица, то эту выборку можно убрать  
 t as (select 10.000 value union
           select 10.001 union
           select 10.002 union
           select 10.003 union
           select 10.005 union
           select 10.009 -- специально добавил контр. пример
          ),
-- Таблица-генератор последовательности чисел от min(t.value) до max(t.value) с шагом 0.001 с помощью CTE (есть ограничение по глубине рекурсии!)
num_series AS (
  SELECT (select min(value) from t)  AS num
  UNION ALL
  SELECT num + 0.001 FROM num_series
   WHERE num < (select max(value) from t)
)
-- Запрос, в котором сопоставляем таблицу генератор и исходную таблицу, чтобы найти недостающие кванты
SELECT * 
  FROM num_series
 where not exists(select t.value from t where t.value = num_series.num)
     and num_series.num >= 10.000

PS: Нужен MySQL 8 версии и выше, postgres, или СУБД из интерпрайзного сегмента.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы