Aqui está uma abordagem alternativa que requer LAG() que está disponível no SQL 2012, mas observe que os dados de exemplo não contêm "28 dias distintos" antes de cada data. Além disso, o tipo de dados real que está sendo usado não é conhecido (date/smalldatetime/datetime/datetime2) nem é conhecido se é necessário truncar o tempo a partir da data. Portanto, com algumas ressalvas, essa abordagem cria uma série de intervalos de datas para as 28 datas distintas (mas os dados não as fornecem, pois são 28 dias decorridos). Aqui está uma demonstração do sqlfiddle
Configuração do esquema PostgreSQL 9.3 :(como o SQL Server não está operando no sqlfiddle)
CREATE TABLE Table1
(theDate timestamp, 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)
;
Consulta 1 :
select
t1.item
, ranges.theStart
, ranges.theEnd
, sum(t1.value)
, sum(t1.value) / 28 avg
from (
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
) ranges
inner join table1 t1 on theDate between ranges.theStart and ranges.theEnd
group by
t1.item
, ranges.theStart
, ranges.theEnd
Resultados :
| item | thestart | theend | sum | avg |
|------|----------------------------|---------------------------|------|-----|
| 1230 | December, 04 2010 00:00:00 | January, 01 2011 00:00:00 | 626 | 22 |
| 1230 | December, 05 2010 00:00:00 | January, 02 2011 00:00:00 | 857 | 30 |
| 1230 | December, 06 2010 00:00:00 | January, 03 2011 00:00:00 | 1429 | 51 |
| 1230 | December, 07 2010 00:00:00 | January, 04 2011 00:00:00 | 2204 | 78 |
| 1230 | December, 08 2010 00:00:00 | January, 05 2011 00:00:00 | 2864 | 102 |
| 1230 | December, 09 2010 00:00:00 | January, 06 2011 00:00:00 | 3526 | 125 |
| 1230 | December, 10 2010 00:00:00 | January, 07 2011 00:00:00 | 4067 | 145 |
| 1230 | December, 11 2010 00:00:00 | January, 08 2011 00:00:00 | 4916 | 175 |
| 1230 | December, 12 2010 00:00:00 | January, 09 2011 00:00:00 | 5548 | 198 |
| 1230 | December, 13 2010 00:00:00 | January, 10 2011 00:00:00 | 6454 | 230 |
| 1230 | December, 14 2010 00:00:00 | January, 11 2011 00:00:00 | 7415 | 264 |
| 1230 | December, 15 2010 00:00:00 | January, 12 2011 00:00:00 | 7776 | 277 |
| 1230 | December, 04 2011 00:00:00 | January, 01 2012 00:00:00 | 461 | 16 |
| 1230 | December, 05 2011 00:00:00 | January, 02 2012 00:00:00 | 1389 | 49 |
| 1230 | December, 06 2011 00:00:00 | January, 03 2012 00:00:00 | 2244 | 80 |
| 1230 | December, 07 2011 00:00:00 | January, 04 2012 00:00:00 | 2849 | 101 |
| 1230 | December, 08 2011 00:00:00 | January, 05 2012 00:00:00 | 2932 | 104 |
| 1230 | December, 09 2011 00:00:00 | January, 06 2012 00:00:00 | 2976 | 106 |
| 1230 | December, 10 2011 00:00:00 | January, 07 2012 00:00:00 | 3358 | 119 |
| 1230 | December, 11 2011 00:00:00 | January, 08 2012 00:00:00 | 4220 | 150 |
| 1230 | December, 12 2011 00:00:00 | January, 09 2012 00:00:00 | 4769 | 170 |
| 1230 | December, 13 2011 00:00:00 | January, 10 2012 00:00:00 | 5401 | 192 |
| 1230 | December, 14 2011 00:00:00 | January, 11 2012 00:00:00 | 5403 | 192 |
| 1230 | December, 15 2011 00:00:00 | January, 12 2012 00:00:00 | 5429 | 193 |
OBS:Para SQL Server
- em vez de
theDay - INTERVAL '28 DAYS'
use dataadd(dia,-28,oDia)