现在的位置: 首页 > 综合 > 正文

又做了一个很过瘾sql题

2013年10月14日 ⁄ 综合 ⁄ 共 1538字 ⁄ 字号 评论关闭

 

 

原帖在

 

http://topic.csdn.net/u/20090903/22/751123e7-cf3d-4322-88f7-5b517561aaa9.html?seed=2061884401&r=59583716#r_59583716

 

一个很有趣的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行。

 

 

抱歉!评论已关闭.