У меня есть числовой интервал от X до Y (например, x = 100, y = 200, поэтому интервал равен 100, 101,... 200) и есть таблица с двумя столбцами «от» и «два», что означает другие интервалы, как
from to
110 120
130 140
Мне нужно вычесть из диапазона (x, y) все диапазоны в таблице (от, до). Итак, результат будет
100 109
121 129
141 200
Является ли это возможным?
Это немного сложно понять. Я не уверен, что вы спрашиваете. Не могли бы вы быть немного более ясным в том, что вычитается из чего?
Что вы вычитаете? Почему 110 стало 100, а 120 стало 109? Откуда взялись 141 и 200 ряд?
да, x = 100, y = 200 исходят из.
Почему 110 стало 100, а 120 стало 109? У нас есть интервал от 100 до 200, и еще один интервал от 110 до 120, так что это 110, 111, 112,... 120. После вычитания начальный интервал будет от 100 до 109, и от 121 до 200


Один из способов будет (ДЕМО)
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.
Откуда 100 и 20?