- 作者: 三十而立
- 时间:2009年9月05日 6:08:31
- 本文出自 “inthirties(三十而立)”博客,转载请务必注明作者和保留出处http://blog.csdn.net/inthirties/archive/2009/09/05/4522543.aspx
原帖在
一个很有趣的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 groupby trunc((rownum-1)/2) order by trunc((rownum-1)/2);NO SUM(N) TITLE---------- ---------- ------------------------------0 26 20090901+200909021 25 20090903+200909062 25 20090907+200909083 29 20090909+200909104 33 20090911+200909125 37 20090913+20090914已选择6行。