sql-server – 如何查找连续序列号组的边界?
发布时间:2020-05-28 16:05:30 所属栏目:MsSql 来源:互联网
导读:我有一个表格,其中包含以下定义 CREATE TABLE mytable ( id INT IDENTITY(1, 1) PRIMARY KEY, number BIGINT, status INT ) 和示例数据 INSERT INTO mytableVALUES (100,0), (101,0), (102,0),
|
我有一个表格,其中包含以下定义 CREATE TABLE mytable
(
id INT IDENTITY(1,1) PRIMARY KEY,number BIGINT,status INT
)
和示例数据 INSERT INTO mytable VALUES (100,0),(101,(102,(103,(104,1),(105,(106,(107,(1014,(1015,(1016,(1017,0) 仅查看status = 0的行,如何将Number值折叠为连续序列号的范围并查找每个范围的开始和结束? 即对于示例数据,结果将是 FROM to Number 100 103 Number 106 107 Number 1014 1015 Number 1017 1017 解决方法正如评论中所提到的,这是一个典型的差距和岛屿问题.由Itzik Ben Gan推广的解决方案是使用ROW_NUMBER()OVER(ORDER BY number) – 数字在“岛”内保持不变并且不能出现在多个岛中的事实. WITH T
AS (SELECT ROW_NUMBER() OVER (ORDER BY number) - number AS Grp,number
FROM mytable
WHERE status = 0)
SELECT MIN(number) AS [From],MAX(number) AS [To]
FROM T
GROUP BY Grp
ORDER BY MIN(number)
注意:如果数字不能保证是唯一的,请在上面的代码中用DENSE_RANK代替ROW_NUMBER. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- mysql中如何判断当前是字符 mysql判断字段中有无汉字
- sql – 实现标记的方法 – 各自的优点和缺点
- Sql Server 2012 转换函数的比较(Cast、Convert和Parse)
- 如何修改Mysql数据库的保存目录?
- sql – 为什么“SELECT DISTINCT a,b FROM …”返回的记录少
- sql-server – “避免基于递增密钥创建聚簇索引”是SQL Ser
- 在没有自动增量字段的数据库上的sql – AutoIncrement字段
- SQL Server远程定时备份数据库脚本分享
- sqlserver数据库移动数据库路径的脚本示例
- 数据库 – 为数据库应用程序留下审计跟踪/更改历史记录的有
