原文:在论坛中出现的比较难的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. pecl和pear 的区别和联系

    Pear:是PHP的扩展代码包,所有的扩展均以PHP代码的形式出现,功能强大,安装简单,甚至可以改改就用.使用的时候,要在代码中进行Include才能够使用. Pecl:是PHP的标准扩展,可以补充实 ...

  2. ajax 提交 form表单 ,后台执行两次的问题

      网上大多的答案是说同步不同步的问题,但是我把异步改成同步也不行.async: false,   // 单击时表单检查 $('.btn-next a').click(function () { if ...

  3. python操作excel实用脚本

    import xlrd data = xlrd.open_workbook('/home/ppe/workspace/pythonwp/tianranqi_org.xls') table = data ...

  4. Linux CentOS 7 常用命令集合

  5. https://www.cnblogs.com/

    Linux如何查看端口 1.lsof -i:端口号 用于查看某一端口的占用情况,比如查看8000端口使用情况,lsof -i:8000 # lsof -i:8000 COMMAND PID USER ...

  6. 【Leetcode_easy】690. Employee Importance

    problem 690. Employee Importance 题意:所有下属和自己的重要度之和,所有下属包括下属的下属即直接下属和间接下属. solution:DFS; /* // Employe ...

  7. iOS面试-深拷贝和浅拷贝

    浅copy:实际上的内存只有一份 任何copy都只是指向这个内存的一个引用 深copy:原始数据有一份 每一个copy的对象不再是引用 而是内容大小一样 内存地址不同的独立对象 系统的非容器类对象 c ...

  8. Vidual Studio vs2013彻底卸载

    我的win10 1803 2019年年中升级的,非常后悔,持续不间断的假死状态让人很无奈.又不舍得回退,因为很多保存的隐藏数据. 开始清理系统吧,东西越少性能越好,于是电脑就成了纯净版,甚至连 看到了 ...

  9. 慕课零基础学java语言翁恺老师——第二周编程题

    1.时间换算(5分) 题目内容: UTC是世界协调时,BJT是北京时间,UTC时间相当于BJT减去8.现在,你的程序要读入一个整数,表示BJT的时和分.整数的个位和十位表示分,百位和千位表示小时.如果 ...

  10. H5本地存储(转)

    H5本地存储  一.本地存储由来的背景         众所周知Html4时代Cookie的大小.格式.存储数据格式等限制,网站应用如果想在浏览器端存储用户的部分信息,那么只能借助于Cookie.但是 ...