sql - 按列顺序获取相同的范围值

标签 sql sql-server gaps-and-islands

我有一张 table

ID Value
1  2
2  3
3  3
4  3
5  2
6  2
7  1

我想对值进行分组,但仍然按 ID 排序,如下所示

ID   Value
1    2
2-4  3
5-6  2
7    1

我该怎么做?

最佳答案

DECLARE @t TABLE (
    ID INT PRIMARY KEY,
    Value INT
)

INSERT INTO @t (ID, Value)
VALUES (1,2),(2,3),(3,3),(4,3),(5,2),(6,2),(7,1)

SELECT 
    ID =
        CASE WHEN mx = mn
            THEN CAST(mx AS VARCHAR(10))
            ELSE CAST(mn AS VARCHAR(10)) + '-' + CAST(mx AS VARCHAR(10))
        END,
    Value
FROM (
    SELECT group_id, mx = MAX(ID), mn = MIN(ID), Value = MAX(Value)
    FROM (
        SELECT
              *
            , group_id =
                ROW_NUMBER() OVER (ORDER BY ID) -
                ROW_NUMBER() OVER (PARTITION BY Value ORDER BY ID)
        FROM @t
    ) t
    GROUP BY group_id
) t

输出 -

ID    Value
----- -----------
1     2
2-4   3
5-6   2
7     1

关于sql - 按列顺序获取相同的范围值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34508527/

相关文章:

sql - 根据开始/结束标记将 GROUP_ID 分配给行

mysql - 如何将 'not in'语句转换为与group by连接

c# - 从用户在 asp.net c# 中输入的数据向 SQL Server 数据库添加行

javascript - JS 中的 OData 日期过滤

SQL Server - 如何将派生表用于计算字段?

sql - 缺口和孤岛,全师版

sql - 如何在 PostgreSQL 中查找序列中的间隙?

sql - CASE WHEN 条件表达式的别名

php - [MySql]如何从一个表复制一行到另一个表并填充额外的列?

sql-server - 通过 JDBC 作为 Windows 用户对 SQL Server 实例进行身份验证