Выберите последующие числа в таблице с результатом в диапазонах - PullRequest
0 голосов
/ 02 февраля 2020

Мне нужно доставить результат в следующем формате: [12-14] [20] [34-35]

Есть ли более разумный или элегантный подход, чем итерация курсора по выбору этого столбца ?

Выбор может быть довольно большим.

Таблица:

|---------------------|
|      col1           |
|---------------------|
|      12             |
|---------------------|
|      13             |
|---------------------|
|      14             |
|---------------------|
|      20             |
|---------------------|
|      34             |
|---------------------|
|      35             |
|---------------------|

1 Ответ

1 голос
/ 02 февраля 2020

Как уже говорили другие, это проблема пробелов и островков, поэтому вам нужно выяснить, какие числа являются началом последовательности, а какие - концом последовательности.

Я сделал это, используя два подзапросы и их объединение:

SELECT  CASE
            WHEN startSeq.Col1 = endSeq.Col1
            THEN '[' + CONVERT(VARCHAR(2),startSeq.Col1) +']'
            ELSE '[' + CONVERT(VARCHAR(2),startSeq.Col1) + '-' + CONVERT(VARCHAR(2),endSeq.Col1) + ']'
        END
FROM    (
            SELECT  Col1,
                    ROW_NUMBER() OVER(ORDER BY Col1) AS RowN
            FROM    Nums a
            WHERE   NOT EXISTS (
                                    SELECT  Col1
                                    FROM    Nums b
                                    WHERE   b.Col1 = a.Col1 - 1
                                )
        ) startSeq
        JOIN (
                SELECT  Col1,
                        ROW_NUMBER() OVER(ORDER BY Col1) AS RowN
                FROM    Nums a
                WHERE   NOT EXISTS (
                                        SELECT  Col1
                                        FROM    Nums b
                                        WHERE   b.Col1 = a.Col1 + 1
                                    )
                ) endSeq
            ON startSeq.RowN = endSeq.RowN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...