Это решение основано на некоторых предположениях и может помочь вам:
- первая часть каждого ряда - РАЗДЕЛ
- вторая часть каждой строки - ID
Создание таблицы:
CREATE TABLE [dbo].[Gaps] (
[Text] nvarchar(50) NOT NULL
);
INSERT [dbo].[Gaps] ([Text])
VALUES
('CI-480-1617'),
('CI-481-1617'),
('CI-482-1617'),
('CI-483-1617'),
('CI-484-1617'),
('CI-485-1617'),
('CI-486-1617'),
('CI-487-1617'),
('CW-095-1617');
Нахождение пробелов:
WITH IDS (Section, Nmr) AS (
SELECT
SUBSTRING([Text], 1, CHARINDEX('-', [Text]) - 1),
CONVERT(int, SUBSTRING([Text], CHARINDEX('-', [Text]) + 1, CHARINDEX('-', [Text], CHARINDEX('|', [Text]))))
FROM Gaps
UNION ALL
SELECT
DISTINCT SUBSTRING([Text], 1, CHARINDEX('-', [Text]) - 1),
0
FROM Gaps
-- Uncomment next lines if you want to get the gap to some MAX value
--UNION ALL
--SELECT
-- DISTINCT SUBSTRING([Text], 1, CHARINDEX('-', [Text]) - 1),
-- 1000
--FROM Gaps
)
SELECT Section, StartNmr = cur + 1, EndNmr = nxt - 1
FROM (
SELECT
Section,
cur = Nmr,
nxt = (
SELECT MIN(B.Nmr)
FROM IDS AS B
WHERE B.Section = A.Section AND B.Nmr > A.Nmr
)
FROM IDS AS A
) AS D
WHERE nxt - cur > 1
ORDER BY Section, StartNmr
Выход (без значения MAX):
-----------------------
Section StartNmr EndNmr
-----------------------
CI 1 479
CW 1 94
Выход (с максимальным значением):
-----------------------
Section StartNmr EndNmr
-----------------------
CI 1 479
CI 488 999
CW 1 94
CW 96 999