Вычесть один диапазон чисел из другого

У меня есть числовой интервал от X до Y (например, x = 100, y = 200, поэтому интервал равен 100, 101,... 200) и есть таблица с двумя столбцами «от» и «два», что означает другие интервалы, как

from    to
110    120
130    140

Мне нужно вычесть из диапазона (x, y) все диапазоны в таблице (от, до). Итак, результат будет

100 109 
121 129 
141 200

Является ли это возможным?

Откуда 100 и 20?

Gordon Linoff 22.01.2019 01:00

Это немного сложно понять. Я не уверен, что вы спрашиваете. Не могли бы вы быть немного более ясным в том, что вычитается из чего?

Nick A 22.01.2019 01:01

Что вы вычитаете? Почему 110 стало 100, а 120 стало 109? Откуда взялись 141 и 200 ряд?

Ben 22.01.2019 01:01

да, x = 100, y = 200 исходят из.

Duke Risbow 22.01.2019 01:04

Почему 110 стало 100, а 120 стало 109? У нас есть интервал от 100 до 200, и еще один интервал от 110 до 120, так что это 110, 111, 112,... 120. После вычитания начальный интервал будет от 100 до 109, и от 121 до 200

Duke Risbow 22.01.2019 01:04
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
2
5
143
1

Ответы 1

Один из способов будет (ДЕМО)

DECLARE @X INT = 100,
        @Y INT = 200;

WITH N(N)
     AS (SELECT @X
         UNION ALL
         SELECT N + 1
         FROM   N
         WHERE  N < @Y),
     T1
     AS (SELECT N,
                NewGrp = CASE WHEN N = 1 + LAG(N) OVER (ORDER BY N) THEN 0 ELSE 1 END
         FROM   N
         WHERE  NOT EXISTS (SELECT *
                            FROM   #intervals
                            WHERE  N BETWEEN [from] AND [to])),
     T2
     AS (SELECT N,
                Grp = SUM(NewGrp) OVER (ORDER BY N ROWS UNBOUNDED PRECEDING) 
         FROM   T1)
SELECT MIN(N),
       MAX(N)
FROM   T2
GROUP  BY Grp
OPTION (MAXRECURSION 10000) 

Вы можете упростить вещи и сделать их более эффективными, используя таблицу постоянных чисел вместо рекурсивного CTE.

Другие вопросы по теме