原文:在论坛中出现的比较难的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. Java-JUC(零):Java:现有线程T1/T2/T3,如何确保T1执行完成之后执行T2,T3在T2执行完成之后执行。

    要实现多个线程执行完成先后,就要知道如何实现线程之间的等待,java线程等待实现是join.java的jdk中join方法实现如下: public final synchronized void jo ...

  2. Framework7 + Angular 开发问题解决汇总

    本篇主要汇总一下使用Framework7 + Angular 开发中遇到的一些难点及我的解决方法,以后再遇到会在这里继续更新. 一.页面表格按需加载 情况描述:默认加载10条,在用户上拉页面是再进行下 ...

  3. vue+Typescript初级入门

    Typescript 在前端圈已经逐渐普及,Vue 2.5.0 改进了类型声明,使得对 TypeScript 更加友好 不过要想在项目中直接使用 TypeScript 仍然需要对项目进行一些改造 PS ...

  4. 算法习题---4-5IP网络(Uva1590)

    一:题目 给出m(1到10000之间)个IP地址,求他们最小的网络号和子网掩码 (一)样例输入 3 表示要获取的IP地址个数 194.85.160.177 IP地址 194.85.160.183 19 ...

  5. 终极解决办法rvct Cannot obtain license for Compiler (feature compiler) with license version >= 3.1

    参考:https://blog.csdn.net/nic_r/article/details/7458038 ARM C/C++ Compiler, RVCT4. [Build ] armcc : e ...

  6. Django中验证码的登录

    需求概述 一般登录页面或者其他页面都需要验证码的功能,那在Django中如何实现呢? 这基本就需要用到第三方模块了:pillow 还需要两个文件,一个是字体文件:Monaco.ttf,另一个是一个模块 ...

  7. LeetCode_160. Intersection of Two Linked Lists

    160. Intersection of Two Linked Lists Easy Write a program to find the node at which the intersectio ...

  8. (十四)Centos之安装vsftp服务

    一.为什么要安装vsftp服务 我们需要向centos操作系统的服务器上上传文件或者下载文件,这时候,ftp有必要安装下,我们选择主流的vsftp 二.安装 第一步:安装vsftp yum insta ...

  9. Mac更新npm和node版本

    npm: 查看当前版本: npm --version 更新到最新版: sodu npm install npm@latest -g node: 1.查看当前版本: node -v 2.清除npm当前缓 ...

  10. MySQL中创建存储过程示例

    在这个示例中需要用到一张名为test_table的表,我们使用show create table test_table查看表的创建过程: CREATE TABLE `test_table` ( `id ...