Как найти последовательность пропусков в столбце без идентификатора в SQL Server - PullRequest
0 голосов
/ 31 августа 2018

У меня более десяти тысяч строк в таблице, как показано ниже, и я хочу найти пропущенные пробелы в порядковом номере в этом списке

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

Вы можете мне помочь?

Спасибо

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Это решение основано на некоторых предположениях и может помочь вам:

  • первая часть каждого ряда - РАЗДЕЛ
  • вторая часть каждой строки - 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
0 голосов
/ 31 августа 2018

Без примеров данных я не могу протестировать решение, но что-то подобное может помочь вам в текущей ситуации:

WITH CTE AS -- end previous statement with semi colon
(
    SELECT SUBSTRING (ColumnA, 4,3) AS SeqNumb, 
         ROW_NUMBER() OVER (PARTITION BY SUBSTRING (ColumnA, 4,3) ORDER BY (SELECT 1)) AS RowNumb
FROM TableA
)

SELECT C.*, C2.RowNumb - C.RowNumb AS Gap
FROM CTE AS C
LEFT JOIN CTE AS C2 ON C.RowNumb = C2.RowNumb - 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...