Дано:
Есть таблица например beg_end с полями begid и endid.
В ней большим списком хранятся интервалы, например вот такие данные:
0 19
20 39
80 99
100 119
120 139
160 179
60 79
Задача:
Получить список непрерывных интервалов и кол-ва в интервале, не используя циклы (ну для данного случая такой результат в формате начало-конец-количество):
0 39 40
60 139 80
160 179 20
Решение:
SELECT
IDENTITY(INT,1,1) AS id,
t1.begid
INTO
#tmp1
FROM
beg_end t1
LEFT JOIN beg_end t2
ON t1.begid = t2.endid + 1
WHERE
t2.endid IS NULL
ORDER BY
t1.begid
SELECT
IDENTITY(INT,1,1) AS id,
t1.endid
INTO
#tmp2
FROM
beg_end t1
LEFT JOIN beg_end t2
ON t1.endid = t2.begid - 1
WHERE
t2.endid IS NULL
ORDER BY
t1.endid
SELECT
t1.begid,
t2.endid,
t2.endid - t1.begid + 1 AS qty
FROM
#tmp1 t1
INNER JOIN #tmp2 t2
ON t1.id = t2.id
Как это ни удивительно, работает!
Честно - сам удивлися.