巧妙利用PARTITION分组排名递增特性解决合并连续相同数据行
问题提出 先造一些测试数据以说明题目: 数据说明,ID列连续自增,列1和列2都是TFS中PBI的状态记录,就是从什么变更到什么,如新建到批准,批准到提交神马的 现在要求连续且相同的状态变更记录合并,不连续或者不同的状态变更保留,例如: 以上图为例,ID为1,4,5,6的记录都是从New到Approved状态,但是记录1与记录4、5、6不相邻,或者说不连续,那么就要分成两组, 记录1一组,记录4、5、6一组,其它记录因为状态变更不相同所以全部保留,最后的查询结果应该长成下图这个样子: 继续之前你可以先自己试下,这可能会带来新的解题思路, 解题思路 该问题的关键在于GROUP BY会把记录1、4、5、6合并在一起,而这不符合要求,仅需要合并4、5、6,源表里没有这样一个字段可以将记录1与记录4、5、6区分开来,这是解题的关键 这里可以利用RANK函数配合使用PARTITION关键字,首先把1456分到一组去,同时产生一个组内排名的新字段R,这个排名R很关键,后边会用到,见下图: RANK函数不了解的点这里 RANK函数以Col1 + Col2为分组条件,这样分成了四组,分别是New-Approved、Approved-Commited、Commited-In Progress、Approved-Removed 在New-Approved组内,记录1、4、5、6分别排名1、2、3、4;其它组内仅一条记录,在其组内排名均为1 现在制造了一个R字段,R字段标识了每条记录在其组内的排名,排名自1开始递增, 源表内ID自增,组内排名R递增,这就是解题的关键, 当连续相同的记录出现时,其ID与其排名R在同时递增,则其差值是相同的,拿到这个差值就可以很容易解决题目了,看下图: 记录4、5、6相同且连续出现,其ID与其排名在同时增长,其差值则保持不变,这里使用Col1 + Col2 + Gap作为分组条件即可将记录4、5、6合并,再取个最小ID出来,问题解决,完整脚本如下: 可是如果ID不连续时怎么办呢?这个不难,参考[MSSQL]ROW_NUMBER函数 (编辑:哈尔滨站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 利用ROW_NUMBER() OVER函数给SQL数据库中每一条记录分配行号
- sql-server – 为什么还有varchar数据类型?
- sql-server – 将SQLServer 2000数据库导出到XML的最简单方
- sql server2012附加数据库问题解决方法
- 根据sql脚本修改数据库表结构的几种解决方案
- sql server启动不了, MSSQL 18052错误: 9003,严重度: 20,
- 一些有用的sql语句整理 推荐收藏
- SQLServer2005 批量查询自定义对象脚本
- SQL SERVER 2000 9003错误的解决方法(只适用于SQL2000)
- SQLServer 连接失败错误故障的分析与排除