主页 > 知识库 > 巧妙利用PARTITION分组排名递增特性解决合并连续相同数据行

巧妙利用PARTITION分组排名递增特性解决合并连续相同数据行

热门标签:怎样把地图标注导入公司地址 400外呼系统合法 洛阳外呼系统平台 地图标注一个圆圈怎么用 如何在地图标注自己店铺 真人语音电销机器人 广州人工电销机器人费用 宁波人工外呼系统有效果吗 电销机器人被曝光

问题提出

先造一些测试数据以说明题目:

DECLARE @TestData TABLE(ID INT,Col1 VARCHAR(20),Col2 VARCHAR(20)) 
INSERT INTO @TestData(ID,Col1,Col2) 
SELECT 1,'New','Approved' UNION ALL 
SELECT 2,'Approved','Commited' UNION ALL 
SELECT 3,'Commited','In Progress' UNION ALL 
SELECT 4,'New','Approved' UNION ALL 
SELECT 5,'New','Approved' UNION ALL 
SELECT 6,'New','Approved' UNION ALL 
SELECT 7,'Approved','Removed' 
SELECT * FROM @TestData

数据说明,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函数

您可能感兴趣的文章:
  • Mysql数据表分区技术PARTITION浅析
  • sqlserver巧用row_number和partition by分组取top数据
  • 分区软件PartitionMagic的使用方法(images)及注意事项

标签:珠海 烟台 东营 晋中 石家庄 北海 南昌 咸宁

巨人网络通讯声明:本文标题《巧妙利用PARTITION分组排名递增特性解决合并连续相同数据行》,本文关键词  巧妙,利用,PARTITION,分组,;如发现本文内容存在版权问题,烦请提供相关信息告之我们,我们将及时沟通与处理。本站内容系统采集于网络,涉及言论、版权与本站无关。
  • 相关文章
  • 下面列出与本文章《巧妙利用PARTITION分组排名递增特性解决合并连续相同数据行》相关的同类信息!
  • 本页收集关于巧妙利用PARTITION分组排名递增特性解决合并连续相同数据行的相关信息资讯供网民参考!
  • 推荐文章