Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Скользящее окно по 4 дня  [new]
Alexander2
Member

Откуда: Calgary
Сообщений: 1167
Можно ли в T-SQL подсчитывать в скользящем окне (диапазон 4 дня, назад в прошлое, начиная с первой даты) среднее значение Items и показывать для каждой строки в дополнительной колонке?
Просмотрел форум, FAQ, не нашел решения.

Исходные данные
MyDate Items
01/06/2012 17
25/05/2012 9
18/05/2012 9
11/05/2012 19
04/05/2012 23
27/04/2012 22
20/04/2012 22
13/04/2012 22
06/04/2012 29
30/03/2012 20
23/03/2012 34
16/03/2012 27
09/03/2012 38
02/03/2012 27
24/02/2012 26
17/02/2012 28
10/02/2012 31
03/02/2012 43
22 июн 12, 07:35    [12757176]     Ответить | Цитировать Сообщить модератору
 Re: Скользящее окно по 4 дня  [new]
LelikB
Member

Откуда: СПб
Сообщений: 64
Alexander2,

4 дня или 4 даты?

Если 4 даты, то например так:
declare @t table 
(
 MyDate  smalldatetime
,Items int
)

insert @t
select '01/06/2012', 17 union all
select '25/05/2012', 9  union all
select '18/05/2012', 9  union all
select '11/05/2012', 19  union all
select '04/05/2012', 23  union all
select '27/04/2012', 22  union all
select '20/04/2012', 22  union all
select '13/04/2012', 22  union all
select '06/04/2012', 29  union all
select '30/03/2012', 20  union all
select '23/03/2012', 34  union all
select '16/03/2012', 27  union all
select '09/03/2012', 38  union all
select '02/03/2012', 27  union all
select '24/02/2012', 26  union all
select '17/02/2012', 28  union all
select '10/02/2012', 31  union all
select '03/02/2012', 43

select MyDate, Items,0.25*sum(Items) over(partition by grp) as [avg]
from
(
select *, (row_number() over(order by Mydate)-1)/4 as grp
from @t
) s
22 июн 12, 07:55    [12757186]     Ответить | Цитировать Сообщить модератору
 Re: Скользящее окно по 4 дня  [new]
Alexander2
Member

Откуда: Calgary
Сообщений: 1167
LelikB,

спасибо, щас попробую
______________________________
4 дневное окно, начиная с верхней строки, затем 4 дня, начиная с второй,....
22 июн 12, 08:03    [12757199]     Ответить | Цитировать Сообщить модератору
 Re: Скользящее окно по 4 дня  [new]
Alexander2
Member

Откуда: Calgary
Сообщений: 1167
LelikB,

не-е, так не годится,

2012-01-06 00:00:00.000 14 34.25
2012-01-13 00:00:00.000 50 34.25
2012-01-20 00:00:00.000 29 34.25
2012-01-27 00:00:00.000 44 34.25
2012-02-03 00:00:00.000 43 32
2012-02-10 00:00:00.000 31 32
2012-02-17 00:00:00.000 28 32
2012-02-24 00:00:00.000 26 32


Надо чтобы "скольжение"/смещение 4-дневного окна на один день назад было. То есть в первой выборке записи с 1 по 4, во второй - с 2 по 5 и так далее...с перекрытием.
22 июн 12, 08:09    [12757208]     Ответить | Цитировать Сообщить модератору
 Re: Скользящее окно по 4 дня  [new]
LelikB
Member

Откуда: СПб
Сообщений: 64
Alexander2,

А так?
;with c as 
(
select *, row_number() over(order by MyDate desc) as rn
from @t
)
, cc as
(
select c1.MyDate, c1.Items, isnull(c2.MyDate,'19000101') as mindate
from c c1
 left join c c2
  on c1.rn = c2.rn-4
) 
select MyDate, Items
	,(select avg(c2.Items*1.0) from cc c2 where c2.MyDate<=c1.MyDate and c2.MyDate>c1.mindate)
from cc c1
22 июн 12, 08:24    [12757243]     Ответить | Цитировать Сообщить модератору
 Re: Скользящее окно по 4 дня  [new]
Alexander2
Member

Откуда: Calgary
Сообщений: 1167
LelikB,

хммм,...зверь-машина!!!

2012-06-01 00:00:00.000 17 13.5
2012-05-25 00:00:00.000 9 15
2012-05-18 00:00:00.000 9 18.25
2012-05-11 00:00:00.000 19 21.5
2012-05-04 00:00:00.000 23 22.25
2012-04-27 00:00:00.000 22 23.75
2012-04-20 00:00:00.000 22 23.25
2012-04-13 00:00:00.000 22 26.25
2012-04-06 00:00:00.000 29 27.5
2012-03-30 00:00:00.000 20 29.75
2012-03-23 00:00:00.000 34 31.5
2012-03-16 00:00:00.000 27 29.5

большой респект и уважуха!
22 июн 12, 08:35    [12757278]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить