Ето алтернативен подход, който изисква LAG(), който е достъпен от SQL 2012, но имайте предвид, че примерните данни не съдържат „28 отделни дни“ преди всяка дата. Също така действителният тип данни, който се използва, не е известен (дата/smalldatetime/datetime/datetime2), нито е известно дали е необходимо съкращаване на времето от датата. Така че с някои предупреждения този подход създава поредица от периоди от време за 28-те отделни дати (но ако данните не ги предоставят, тогава те са 28 изминали дни). Ето една демонстрация на sqlfiddle
Настройка на схемата на PostgreSQL 9.3 :(тъй като SQL Server не работи в 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);
Заявка 1 :
изберете t1.item, ranges.theStart, ranges.theEnd, sum(t1.value) , sum(t1.value) / 28 avgfrom ( изберете coalesce(lag(theDay,28) over(order by theDay) ), theDay - ИНТЕРВАЛ '28 DAYS') като начало, theDay като край от (изберете отделно предаване (датата като дата) theDay от Table1) дни) rangesinner присъединяване към таблица1 t1 на theDate между ranges.theStart и ranges.theEndgroup от t1.item , ranges.theStart , ranges.theEnd
<предварителен код>| елемент | началото | край | сума | ср. ||------|----------------------------|----------- ----------------|------|-----|| 1230 | 04 декември 2010 г. 00:00:00 | 01 януари 2011 г. 00:00:00 | 626 | 22 || 1230 | 05 декември 2010 г. 00:00:00 | 02 януари 2011 г. 00:00:00 | 857 | 30 || 1230 | 06 декември 2010 г. 00:00:00 | 03 януари 2011 г. 00:00:00 | 1429 | 51 || 1230 | 07 декември 2010 г. 00:00:00 | 04 януари 2011 г. 00:00:00 | 2204 | 78 || 1230 | 08 декември 2010 г. 00:00:00 | 05 януари 2011 г. 00:00:00 | 2864 | 102 || 1230 | 09 декември 2010 г. 00:00:00 | 06 януари 2011 г. 00:00:00 | 3526 | 125 || 1230 | 10 декември 2010 г. 00:00:00 | 07 януари 2011 г. 00:00:00 | 4067 | 145 || 1230 | 11 декември 2010 г. 00:00:00 | 08 януари 2011 г. 00:00:00 | 4916 | 175 || 1230 | 12 декември 2010 г. 00:00:00 | 09 януари 2011 г. 00:00:00 | 5548 | 198 || 1230 | 13 декември 2010 г. 00:00:00 | 10 януари 2011 г. 00:00:00 | 6454 | 230 || 1230 | 14 декември 2010 г. 00:00:00 | 11 януари 2011 г. 00:00:00 | 7415 | 264 || 1230 | 15 декември 2010 г. 00:00:00 | 12 януари 2011 г. 00:00:00 | 7776 | 277 || 1230 | 04 декември 2011 г. 00:00:00 | 01 януари 2012 г. 00:00:00 | 461 | 16 || 1230 | 05 декември 2011 г. 00:00:00 | 02 януари 2012 г. 00:00:00 | 1389 | 49 || 1230 | 06 декември 2011 г. 00:00:00 | 03 януари 2012 г. 00:00:00 | 2244 | 80 || 1230 | 07 декември 2011 г. 00:00:00 | 04 януари 2012 г. 00:00:00 | 2849 | 101 || 1230 | 08 декември 2011 г. 00:00:00 | 05 януари 2012 г. 00:00:00 | 2932 | 104 || 1230 | 09 декември 2011 г. 00:00:00 | 06 януари 2012 г. 00:00:00 | 2976 | 106 || 1230 | 10 декември 2011 г. 00:00:00 | 07 януари 2012 г. 00:00:00 | 3358 | 119 || 1230 | 11 декември 2011 г. 00:00:00 | 08 януари 2012 г. 00:00:00 | 4220 | 150 || 1230 | 12 декември 2011 г. 00:00:00 | 09 януари 2012 г. 00:00:00 | 4769 | 170 || 1230 | 13 декември 2011 г. 00:00:00 | 10 януари 2012 г. 00:00:00 | 5401 | 192 || 1230 | 14 декември 2011 г. 00:00:00 | 11 януари 2012 г. 00:00:00 | 5403 | 192 || 1230 | 15 декември 2011 г. 00:00:00 | 12 януари 2012 г. 00:00:00 | 5429 | 193 | NB:За SQL Server
- вместо
theDay - ИНТЕРВАЛ „28 ДНИ“
използвайте dateadd(day,-28,theDay)