トップページに戻る    次のSQLパズルへ    前のSQLパズルへ

10-33 15分単位の集計

SQLパズル

結果テーブル
Time              数量
----------------  ----
2006/01/21 06:15    15
2006/01/21 06:16    14
2006/01/21 06:17    13
2006/01/21 06:18    12
2006/01/21 06:19    11
2006/01/21 06:20    10
2006/01/21 06:21     9
2006/01/21 06:22     8
2006/01/21 06:23     7
2006/01/21 06:24     6
2006/01/21 06:25     5
2006/01/21 06:26     4
2006/01/21 06:27     3
2006/01/21 06:28     2
2006/01/21 06:29     1

15分単位(0分から14分、15分から29分、30分から44分、45分から59分)
で数量の合計と件数と平均と最大と最小を出力する。

出力結果
期間                                   合計  件数  平均  最大  最小
------------------------------------  ----  ----  ----  ----  ----
2006/01/21 06:15から2006/01/21 06:29   120    15     8    15     1


データ作成スクリプト

create table 結果(
Time date,
数量 number(3));

declare
    now date := trunc(sysdate,'MI');
begin
    for i in -100..100 Loop
        insert into 結果 values(now+i/24/60,abs(i));
    end Loop;
    commit;
end;
/


SQL

col 期間 for  a36
col 合計 for 9999
col 件数 for  999
col 平均 for  999
col 最大 for  999
col 最小 for  999

select 期間,sum(数量) as 合計,count(*) as 件数,
avg(数量) as 平均,max(数量) as 最大,min(数量) as 最小
from
(select to_char(Time,'YYYY/MM/DD HH24:')
     || LTrim(to_char(trunc(to_char(Time,'MI')/15)*15,'09')) || 'から'
     || to_char(Time,'YYYY/MM/DD HH24:')
     || LTrim(to_char(trunc(to_char(Time,'MI')/15)*15+15-1,'09')) as 期間,
 数量 from 結果)
group by 期間
order by 期間;


解説

trunc関数で、分を15で割った商を取得して、
15分単位で集計してます。