[MSSQL]SQL疑难杂症实战记录-巧妙利用PARTITION分组排名递增特性解决合并连续相同数据行
问题提出
先造一些测试数据以说明题目:
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函数
[MSSQL]SQL疑难杂症实战记录-巧妙利用PARTITION分组排名递增特性解决合并连续相同数据行的更多相关文章
- 利用泛型和反射,管理配置文件,把Model转换成数据行,并把数据行转换成Model
利用泛型和反射,管理配置文件,把Model转换成数据行,并把数据行转换成Model 使用场景:网站配置项目,为了便于管理,网站有几个Model类来管理配置文件, 比如ConfigWebsiteMo ...
- MSSQL sql server 2005/2008 row_number()函数应用之–删除表中重复记录,只保留一条不重复数据
转自:http://www.maomao365.com/?p=4942 下文主要讲述:重复数据只获取一条的方法 row_number函数在数据库中的功能是为每一行 按照一定的规则生成一个编号,我们常常 ...
- Atitit.数据库新特性战略规划 mssql sql server 2008 SQL2012 SQL2014
Atitit.数据库新特性 mssql sql server 2008 SQL2012 SQL2014 1. Sql2012 新特性 1 1.1. 增加了Sequence对象. 1 1.2. 新的分页 ...
- [红日安全]Web安全Day1 - SQL注入实战攻防
本文由红日安全成员: Aixic 编写,如有不当,还望斧正. 大家好,我们是红日安全-Web安全攻防小组.此项目是关于Web安全的系列文章分享,还包含一个HTB靶场供大家练习,我们给这个项目起了一个名 ...
- MSSQL SQL注入 总结
0x00 MSSQL 基础 MSSQL系统自带库和表 系统自带库 MSSQL安装后默认带了6个数据库,其中4个系统级库:master,model,tempdb和msdb:2个示例库:Northwind ...
- Oracle SQL调优记录
目录 一.前言 二.注意点 三.Oracle执行计划 四.调优记录 @ 一.前言 本博客只记录工作中的一次oracle sql调优记录,因为数据量过多导致的查询缓慢,一方面是因为业务太过繁杂,关联了太 ...
- oracle 、mysql、 sql server使用记录
oracle .mysql. sql server使用记录 mysql常用命令: mysqld --启动mysql数据库 show databases; -- 查看数据库 use database; ...
- Python爬虫实战八之利用Selenium抓取淘宝匿名旺旺
更新 其实本文的初衷是为了获取淘宝的非匿名旺旺,在淘宝详情页的最下方有相关评论,含有非匿名旺旺号,快一年了淘宝都没有修复这个. 可就在今天,淘宝把所有的账号设置成了匿名显示,SO,获取非匿名旺旺号已经 ...
- 巧妙利用Camtasia制作网课
随着互联网的快速发展,网络学习变得非常流行.这种躺在床上就可以获取知识的方法让大家渐渐地都喜欢上了学习,那么我们是否想要了解一下网课的幕后制作呢. 今天我给大家带来的便是巧妙利用Camtasia进行网 ...
随机推荐
- mysql分区查询
SELECT *FROM INFORMATION_SCHEMA.partitions WHERE table_name='表名' and table_schema='数据库名'
- Web API - window - 获取滑动位置
这两个属性都可以获取当前页面的滑动高度 虽然取到了同样的数据,但是我相信底层还是有区别的 不然不会用浪费api吧!
- js 正则 以字母开头必须有 大小写字母数字组成 可以有“@"或 ”.“
js 正则 以字母开头必须有 大小写字母数字组成 可以有“@"或 ”.“ var reg = /^[a-zA-Z]{1}(?=.*[a-z])(?=.*[A-Z])[a-zA-Z\d_@ ...
- [转]LIBSVM-3.18在python环境下的使用
http://blog.csdn.net/lj695242104/article/details/39500039 1)安装Python,直接去官方网站 2)运行“cmd”,直接输入python,查看 ...
- Aborting commit: 'XXX' remains in conflict
Aborting commit: 'XXX' remains in conflict 错误 本地也删除了一个文件夹,用svn 的repo-brower 删除了服务器上的对应的文件夹 ,再次comm ...
- nginx 设置反响代理实现nginx集群
ginx.conf: worker_processes 1; events { worker_connections 1024; } http { include mime.types ...
- 如何使用本地yum源?
首先为大家介绍在Centos系统上如何利用系统光盘/镜像作为yum源,实现程序包的安装等操作 1.首先在VM虚拟机上确保已载入光盘镜像,载入成功后显示如下效果. 2.挂载光盘镜像文件,使用命令: mo ...
- android Studio项目运行时报错“Could not identify launch activity: Default Activity not found”
出现红色的小叉叉,有点蒙圈的感觉 其实只是因为AndroidManifest.xml里面没有设置运行初始的activity <activity android:name=".MainA ...
- const in C++
const关键字是C++中常用的类型修饰符,用法非常灵活,使用const将大大改善程序的健壮性. const的作用 1. 定义const常量: 比如: const int Max = 100; 2. ...
- 学习springMVC框架配置遇到的问题-数据写入不进数据库时的处理办法
配置完了,运行,数据写入不到数据库中,就应该想UserAction 中的handleRequest()方法有没有进去,然后就设置断点.如果发现程序没有进去,就再想办法进去.