0
点赞
收藏
分享

微信扫一扫

又做了一个很过瘾sql题


  • 作者:​​三十而立​​

 


 

一个很有趣的sql题 “超难SQL求助,对连续时间区域分组求和”

 

题目如下 

 

模拟数据如下: 
20090901    10 
20090902    20 
20090903    7 
20090904    5 
20090906    5 
20090908    5 

要求每相邻的两天作为一个单位统计,不能连续单天统计 
结果如下 
20090901+20090902  30 
20090903+20090904  12 
20090906+20090907  5 
20090908+20090909  5 

 

 

用户用相邻的时间来相加,注意,相邻但不一定是连续的时间。

 

这里连续记录分组,用oracle里的rownum处理就OK了,相加就用10g的新功能wmsys.wm_concat

 

得到一下sql

 

select trunc((rownum-1)/2) no, sum(n),  
      replace(wmsys.wm_concat(to_char(d,'yyyymmdd')),',','+') title 
      from 
      (select d, n from test_a order by d asc) t 
      group by trunc((rownum-1)/2) 
      order by trunc((rownum-1)/2)

 

实验一下哟。

 

数据

 

SQL> select n, to_char(d, 'yyyymmdd') d from test_a order by d asc;

 

         N D

---------- --------

        12 20090901

        14 20090902

        14 20090903

        11 20090906

        12 20090907

        13 20090908

        14 20090909

        15 20090910

        16 20090911

        17 20090912

        18 20090913

 

         N D

---------- --------

        19 20090914

 

已选择12行。



结果



SQL> select trunc((rownum-1)/2) no, sum(n),  replace(wmsys.wm_concat(to_char(d,'

yyyymmdd')),',','+') title from (select d, n from test_a order by d asc) t group

 by trunc((rownum-1)/2) order by trunc((rownum-1)/2);

        NO     SUM(N) TITLE

---------- ---------- ------------------------------

         0         26 20090901+20090902

         1         25 20090903+20090906

         2         25 20090907+20090908

         3         29 20090909+20090910

         4         33 20090911+20090912

         5         37 20090913+20090914

已选择6行。



 


 




 




 

举报

相关推荐

0 条评论