原文:在论坛中出现的比较难的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

下面是我的解答:


  1. select *,
  2. dense_rank() over(order by case when exists(select t2.re from #temp t2
  3. where t1.cname = t2.cname
  4. and t1.re= t2.re + 1)
  5. then (select t2.re from #temp t2
  6. where t1.cname = t2.cname
  7. and t1.re= t2.re + 1)
  8. else t1.re
  9. end
  10. ) as xh
  11. from #temp t1
  12. /*
  13. cName re xh
  14. A 1 1
  15. A 2 1
  16. B 3 2
  17. A 4 3
  18. A 5 3
  19. */

但是这个解答是有问题的,因为当连续的记录超过3条时,就会有问题,

所以修改了一下,这个是正确的解法:


  1. create table #temp (cName CHAR(1),re int)
  2. insert into #temp
  3. SELECT 'A',1 UNION ALL
  4. SELECT 'A',2 UNION ALL
  5. SELECT 'B',3 UNION ALL
  6. SELECT 'A',4 UNION ALL
  7. SELECT 'A',5 union all
  8. SELECT 'A',6 union all
  9. SELECT 'A',7 union all
  10. SELECT 'D',8 union all
  11. SELECT 'D',9 union all
  12. SELECT 'D',10 union all
  13. select 'B',11 union all
  14. select 'A',12
  15. ;with t
  16. as
  17. (
  18. select *,
  19. row_number() over(partition by cname order by re) as rownum
  20. from #temp
  21. )
  22. select cname,
  23. re,
  24. dense_rank() over(order by case when exists(select min(t2.re) from t t2
  25. where t1.cname = t2.cname
  26. and t1.re-t1.rownum= t2.re-t2.rownum)
  27. then (select min(t2.re) from t t2
  28. where t1.cname = t2.cname
  29. and t1.re-t1.rownum= t2.re-t2.rownum)
  30. else t1.re
  31. end
  32. ) as xh
  33. from t t1
  34. /*cname re xh
  35. A 1 1
  36. A 2 1
  37. B 3 2
  38. A 4 3
  39. A 5 3
  40. A 6 3
  41. A 7 3
  42. D 8 4
  43. D 9 4
  44. D 10 4
  45. B 11 5
  46. A 12 6
  47. */

在论坛中出现的比较难的sql问题:4(row_number函数+子查询 分组连续编号问题)的更多相关文章

  1. 在论坛中出现的比较难的sql问题:46(日期条件出现的奇怪问题)

    原文:在论坛中出现的比较难的sql问题:46(日期条件出现的奇怪问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有 ...

  2. 在论坛中出现的比较难的sql问题:45(用户在线登陆时间的小时、分钟计算问题)

    原文:在论坛中出现的比较难的sql问题:45(用户在线登陆时间的小时.分钟计算问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. ...

  3. 在论坛中出现的比较难的sql问题:44(触发器专题 明细表插入数据时调用主表对应的数据)

    原文:在论坛中出现的比较难的sql问题:44(触发器专题 明细表插入数据时调用主表对应的数据) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决 ...

  4. 在论坛中出现的比较难的sql问题:42(动态行转列 考勤时间动态列)

    原文:在论坛中出现的比较难的sql问题:42(动态行转列 考勤时间动态列) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.

  5. 在论坛中出现的比较难的sql问题:41(循环替换 循环替换关键字)

    原文:在论坛中出现的比较难的sql问题:41(循环替换 循环替换关键字) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.

  6. 在论坛中出现的比较难的sql问题:40(子查询 销售和历史库存)

    原文:在论坛中出现的比较难的sql问题:40(子查询 销售和历史库存) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有 ...

  7. 在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题)

    原文:在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉 ...

  8. 在论坛中出现的比较难的sql问题:38(字符拆分 字符串检索问题)

    原文:在论坛中出现的比较难的sql问题:38(字符拆分 字符串检索问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得 ...

  9. 在论坛中出现的比较难的sql问题:37(动态行转列 某一行数据转为列名)

    原文:在论坛中出现的比较难的sql问题:37(动态行转列 某一行数据转为列名) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.

随机推荐

  1. 问题: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 ...

  2. 贝济埃曲线quadTo与传统的手势轨迹平滑度对比分析

    package com.loaderman.customviewdemo; import android.content.Context; import android.graphics.Canvas ...

  3. javascript——语法 && 结构

    原文链接:Understanding Syntax and Code Structure

  4. ES6深入浅出-2 新版函数:箭头函数 2 视频-1.视频 箭头函数

    ES3里面的写法 匿名函数是用不了的 还是需要给他赋值 选中的这一部分叫做匿名函数 等于号叫做赋值 let xxx叫做声明 所以说这个地方是三个语法,首先声明一个匿名函数,然后声明一个xxx变量,最后 ...

  5. java数据类型,取值范围,引用类型解析

      与javascript不同,Java是强类型语言,在定义变量前需要声明数据类型.主要分两种数据类型:基本数据类型和引用数据类型. 1.基本数据类型分析: 基本数据类型 数值型 整数型 byte字节 ...

  6. Eclipse导入Spring Boot项目后pom.xml出现红叉的解决办法

    胸怀难的问题是:程序能正常运行,但是pom.xml下面有一个红叉. 解决办法: 右键项目 --> Update project...

  7. Docker - 在CentOS7中安装Docker

    在CentOS 7中安装Docker 1-确认系统信息 # cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) # uname - ...

  8. iOS面试-assign与retain

    assign 对基础数据类型 (NSInteger,CGFloat)和C数据类型(int, float, double, char)等等.        此标记说明设置器直接进行赋值,这也是默认值.在 ...

  9. 【c# 学习笔记】所有类的父类:System.object

    在c#中,所有的类都派生自System.Object类.如果定义的类,没有直达任何基类,编译器就会自动把Object类当作它的基类.和其他类 一样,System.Object类也定义了一组共有的成员, ...

  10. 修改centos7命令行控制台屏幕分辨率

    1) vi /etc/sysconfig/grub 2)  GRUB_CMDLINE_LINUX 在rhgb前加 vga=0x0317  (317为分辨率编码) 3) grub2-mkconfig - ...