Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在表格中选择结果范围内的后续数字_Sql Server_Tsql - Fatal编程技术网

Sql server 在表格中选择结果范围内的后续数字

Sql server 在表格中选择结果范围内的后续数字,sql-server,tsql,Sql Server,Tsql,我需要以以下格式提交结果:[12-14][20][34-35] 有没有比在这个列的select上迭代游标更智能、更优雅的方法 选择的范围可能相当大 表格: |---------------------| | col1 | |---------------------| | 12 | |---------------------| | 13 | |---------------------| |

我需要以以下格式提交结果:[12-14][20][34-35]

有没有比在这个列的select上迭代游标更智能、更优雅的方法

选择的范围可能相当大

表格:

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

正如其他人所说,这是一个缺口和孤岛问题,因此您需要确定哪些数字是序列的开始,哪些数字是序列的结束

我使用两个子查询并将它们连接在一起:

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

听起来像是一个缺口和孤岛问题,
LEAD
。到目前为止,你尝试过什么?你还看了哪些与同一问题(有很多)有关的其他问题,还有哪些问题你不明白?@Larnu我可以用光标迭代来解决,我在这里询问更好的想法。这是一个缺口和孤岛问题,之后可能会有一个聚合来生成范围。这是否回答了您的问题?谢谢你,好先生,它帮助我更快地理解了这个麻烦。