在论坛中出现的比较难的sql问题:4(row_number函数+子查询 分组连续编号问题)
原文:在论坛中出现的比较难的sql问题:4(row_number函数+子查询 分组连续编号问题)
所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路。
求一查询语句
http://bbs.csdn.net/topics/390633004
CREATE #temp (cName CHAR(1),re int)
INSERT #temp
SELECT 'A',1 UNION ALL
SELECT 'A',2 UNION ALL
SELECT 'B',3 UNION ALL
SELECT 'A',4 UNION ALL
SELECT 'A',5
如何查询得到如下的结果:
cName,re,xh
-------------------
'A',1,1
'A',2,1
'B',3,2
'A',4,3
'A',5,3
下面是我的解答:
- 
select *,
- 
       dense_rank() over(order by case when exists(select  t2.re from #temp t2 
- 
                                                   where t1.cname = t2.cname 
- 
                                                   and t1.re= t2.re + 1)
- 
                                            then (select  t2.re from #temp t2 
- 
                                                   where t1.cname = t2.cname 
- 
                                                   and t1.re= t2.re + 1)
- 
                                       else t1.re
- 
                                   end
- 
                         ) as xh
- 
from #temp t1
- 
/*
- 
cName re xh
- 
A	  1	 1
- 
A	  2	 1
- 
B	  3	 2
- 
A	  4	 3
- 
A	  5	 3
- 
*/
但是这个解答是有问题的,因为当连续的记录超过3条时,就会有问题,
所以修改了一下,这个是正确的解法:
- 
create table #temp (cName CHAR(1),re int)
- 
 
- 
insert into #temp
- 
SELECT 'A',1 UNION ALL
- 
SELECT 'A',2 UNION ALL
- 
SELECT 'B',3 UNION ALL
- 
SELECT 'A',4 UNION ALL
- 
SELECT 'A',5 union all
- 
SELECT 'A',6 union all
- 
SELECT 'A',7 union all
- 
SELECT 'D',8 union all
- 
SELECT 'D',9 union all
- 
SELECT 'D',10 union all
- 
select 'B',11 union all
- 
select 'A',12
- 
 
- 
;with t
- 
as
- 
(
- 
select *,
- 
       row_number() over(partition by cname order by re) as rownum
- 
from #temp 
- 
)
- 
 
- 
select cname,
- 
       re,
- 
       dense_rank() over(order by case when exists(select min(t2.re) from t t2 
- 
                                                   where t1.cname = t2.cname 
- 
                                                   and t1.re-t1.rownum= t2.re-t2.rownum)
- 
                                            then (select  min(t2.re) from t t2 
- 
                                                   where t1.cname = t2.cname 
- 
                                                   and t1.re-t1.rownum= t2.re-t2.rownum)
- 
                                       else t1.re
- 
                                   end
- 
                         ) as xh
- 
from t t1
- 
/*cname	re	xh
- 
A	1	1
- 
A	2	1
- 
B	3	2
- 
A	4	3
- 
A	5	3
- 
A	6	3
- 
A	7	3
- 
D	8	4
- 
D	9	4
- 
D	10	4
- 
B	11	5
- 
A	12	6
- 
*/
在论坛中出现的比较难的sql问题:4(row_number函数+子查询 分组连续编号问题)的更多相关文章
- 在论坛中出现的比较难的sql问题:46(日期条件出现的奇怪问题)
		原文:在论坛中出现的比较难的sql问题:46(日期条件出现的奇怪问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有 ... 
- 在论坛中出现的比较难的sql问题:45(用户在线登陆时间的小时、分钟计算问题)
		原文:在论坛中出现的比较难的sql问题:45(用户在线登陆时间的小时.分钟计算问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. ... 
- 在论坛中出现的比较难的sql问题:44(触发器专题 明细表插入数据时调用主表对应的数据)
		原文:在论坛中出现的比较难的sql问题:44(触发器专题 明细表插入数据时调用主表对应的数据) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决 ... 
- 在论坛中出现的比较难的sql问题:42(动态行转列 考勤时间动态列)
		原文:在论坛中出现的比较难的sql问题:42(动态行转列 考勤时间动态列) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路. 
- 在论坛中出现的比较难的sql问题:41(循环替换 循环替换关键字)
		原文:在论坛中出现的比较难的sql问题:41(循环替换 循环替换关键字) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路. 
- 在论坛中出现的比较难的sql问题:40(子查询 销售和历史库存)
		原文:在论坛中出现的比较难的sql问题:40(子查询 销售和历史库存) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有 ... 
- 在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题)
		原文:在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉 ... 
- 在论坛中出现的比较难的sql问题:38(字符拆分 字符串检索问题)
		原文:在论坛中出现的比较难的sql问题:38(字符拆分 字符串检索问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得 ... 
- 在论坛中出现的比较难的sql问题:37(动态行转列 某一行数据转为列名)
		原文:在论坛中出现的比较难的sql问题:37(动态行转列 某一行数据转为列名) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路. 
随机推荐
- 问题:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.5.1:compile (default-compile)
			一:问题 今天编译maven 项目构建失败,提示内容如下: [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler ... 
- 贝济埃曲线quadTo与传统的手势轨迹平滑度对比分析
			package com.loaderman.customviewdemo; import android.content.Context; import android.graphics.Canvas ... 
- javascript——语法 && 结构
			原文链接:Understanding Syntax and Code Structure 
- ES6深入浅出-2 新版函数:箭头函数 2 视频-1.视频 箭头函数
			ES3里面的写法 匿名函数是用不了的 还是需要给他赋值 选中的这一部分叫做匿名函数 等于号叫做赋值 let xxx叫做声明 所以说这个地方是三个语法,首先声明一个匿名函数,然后声明一个xxx变量,最后 ... 
- java数据类型,取值范围,引用类型解析
			与javascript不同,Java是强类型语言,在定义变量前需要声明数据类型.主要分两种数据类型:基本数据类型和引用数据类型. 1.基本数据类型分析: 基本数据类型 数值型 整数型 byte字节 ... 
- Eclipse导入Spring Boot项目后pom.xml出现红叉的解决办法
			胸怀难的问题是:程序能正常运行,但是pom.xml下面有一个红叉. 解决办法: 右键项目 --> Update project... 
- Docker - 在CentOS7中安装Docker
			在CentOS 7中安装Docker 1-确认系统信息 # cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) # uname - ... 
- iOS面试-assign与retain
			assign 对基础数据类型 (NSInteger,CGFloat)和C数据类型(int, float, double, char)等等. 此标记说明设置器直接进行赋值,这也是默认值.在 ... 
- 【c# 学习笔记】所有类的父类:System.object
			在c#中,所有的类都派生自System.Object类.如果定义的类,没有直达任何基类,编译器就会自动把Object类当作它的基类.和其他类 一样,System.Object类也定义了一组共有的成员, ... 
- 修改centos7命令行控制台屏幕分辨率
			1) vi /etc/sysconfig/grub 2) GRUB_CMDLINE_LINUX 在rhgb前加 vga=0x0317 (317为分辨率编码) 3) grub2-mkconfig - ... 
