これは、SQL 2012 から利用できる LAG() を必要とする別のアプローチですが、サンプル データには各日付の前の「28 日間」が含まれていないことに注意してください。また、使用されている実際のデータ型 (date/smalldatetime/datetime/datetime2) も、日付からの時間の切り捨てが必要かどうかも不明です。したがって、いくつかの注意点がありますが、このアプローチでは、28 の異なる日付の一連の日付範囲が作成されます (ただし、データがこれらを提供しない場合、それらは 28 経過日になります)。これは sqlfiddle デモ です
PostgreSQL 9.3 スキーマのセットアップ :(SQL Server が sqlfiddle で動作していないため)
CREATE TABLE Table1 (theDate タイムスタンプ、Value int、promo int、item int);INSERT INTO Table1 (theDate、Value、promo、item)VALUES ('2011-01-01 00:00:00', 626, 0, 1230), ('2011-01-02 00:00:00', 231, 1, 1230), ('2011-01-03 00:00:00', 572, 1, 1230), ( '2011-01-04 00:00:00', 775, 1, 1230), ('2011-01-05 00:00:00', 660, 1, 1230), ('2011-01-06 00:00:00', 662, 1, 1230), ('2011-01-07 00:00:00', 541, 1, 1230), ('2011-01-08 00:00:00', 849, 1 、1230)、('2011-01-09 00:00:00'、632、1、1230)、('2011-01-10 00:00:00'、906、1、1230)、('2011- 01-11 00:00:00', 961, 1, 1230), ('2011-01-12 00:00:00', 361, 0, 1230), ('2012-01-01 00:00:00 ', 461, 0, 1230), ('2012-01-02 00:00:00', 928, 1, 1230), ('2012-01-03 00:00:00', 855, 0, 1230) , ('2012-01-04 00:00:00', 605, 0, 1230), ('2012-01-05 00:00:00', 83, 0, 1230), ('2012-01-06 00:00:00', 44, 0, 1230), ('2012-01-07 00:00:00', 382, 0, 1230), ('2012-01-08 00:00:00', 862 , 0, 1230), ('2012-01-09 00 :00:00', 549, 0, 1230), ('2012-01-10 00:00:00', 632, 0, 1230), ('2012-01-11 00:00:00', 2, 0, 1230), ('2012-01-12 00:00:00', 26, 0, 1230);コード>
クエリ 1 :
select t1.item 、ranges.theStart 、ranges.theEnd 、sum(t1.value) 、sum(t1.value) / 28 avgfrom ( select coalesce(lag(theDay,28) over(order by theDay) ) , theDay - INTERVAL '28 DAYS') as theStart , theDay as theEnd from ( select distinct cast(thedate as date) theDay from Table1 ) days ) rangeinner join table1 t1 on theDate between range.theStart と range.theEndgroup by t1.item 、ranges.theStart、ranges.theEnd
結果 :
<プレ>|アイテム |スタート |終了 |合計 |平均 ||------|--------------------------------|----------- ----|--------|-----|| 1230 | 2010 年 12 月 4 日 00:00:00 | 2011 年 1 月 1 日 00:00:00 | 626 | 22 || 1230 | 2010 年 12 月 5 日 00:00:00 | 2011 年 1 月 2 日 00:00:00 | 857 | 30 || 1230 | 2010 年 12 月 6 日 00:00:00 | 2011 年 1 月 3 日 00:00:00 | 1429年 | 51 || 1230 | 2010 年 12 月 7 日 00:00:00 | 2011 年 1 月 4 日 00:00:00 | 2204 | 78 || 1230 | 2010 年 12 月 8 日 00:00:00 | 2011 年 1 月 5 日 00:00:00 | 2864 | 102 || 1230 | 2010 年 12 月 9 日 00:00:00 | 2011 年 1 月 6 日 00:00:00 | 3526 | 125 || 1230 | 2010 年 12 月 10 日 00:00:00 | 2011 年 1 月 7 日 00:00:00 | 4067 | 145 || 1230 | 2010 年 12 月 11 日 00:00:00 | 2011 年 1 月 8 日 00:00:00 | 4916 | 175 || 1230 | 2010 年 12 月 12 日 00:00:00 | 2011 年 1 月 9 日 00:00:00 | 5548 | 198 || 1230 | 2010 年 12 月 13 日 00:00:00 | 2011 年 1 月 10 日 00:00:00 | 6454 | 230 || 1230 | 2010 年 12 月 14 日 00:00:00 | 2011 年 1 月 11 日 00:00:00 | 7415 | 264 || 1230 | 2010 年 12 月 15 日 00:00:00 | 2011 年 1 月 12 日 00:00:00 | 7776 | 277 || 1230 | 2011 年 12 月 4 日 00:00:00 | 2012 年 1 月 1 日 00:00:00 | 461 | 16 || 1230 | 2011 年 12 月 5 日 00:00:00 | 2012 年 1 月 2 日 00:00:00 | 1389年 | 49 || 1230 | 2011 年 12 月 6 日 00:00:00 | 2012 年 1 月 3 日 00:00:00 | 2244 | 80 || 1230 | 2011 年 12 月 7 日 00:00:00 | 2012 年 1 月 4 日 00:00:00 | 2849 | 101 || 1230 | 2011 年 12 月 8 日 00:00:00 | 2012 年 1 月 5 日 00:00:00 | 2932 | 104 || 1230 | 2011 年 12 月 9 日 00:00:00 | 2012 年 1 月 6 日 00:00:00 | 2976 | 106 || 1230 | 2011 年 12 月 10 日 00:00:00 | 2012 年 1 月 7 日 00:00:00 | 3358 | 119 || 1230 | 2011 年 12 月 11 日 00:00:00 | 2012 年 1 月 8 日 00:00:00 | 4220 | 150 || 1230 | 2011 年 12 月 12 日 00:00:00 | 2012 年 1 月 9 日 00:00:00 | 4769 | 170 || 1230 | 2011 年 12 月 13 日 00:00:00 | 2012 年 1 月 10 日 00:00:00 | 5401 | 192 || 1230 | 2011 年 12 月 14 日 00:00:00 | 2012 年 1 月 11 日 00:00:00 | 5403 | 192 || 1230 | 2011 年 12 月 15 日 00:00:00 | 2012 年 1 月 12 日 00:00:00 | 5429 | 193 |コード>
注:SQL Server の場合
theDay - INTERVAL '28 DAYS'
の代わりに dateadd(day,-28,theDay) を使用