select
t1.date,
t1.ticker,
t1.x,
t1.avgx,
count(*),
sum(t2.x),
avg(t2.x)
from
t t1
left join t t2 on t1.ticker = t2.ticker and t2.date < t1.date and (t1.date - t2.date) <= 30
group by
t1.date,
t1.ticker,
t1.x,
t1.avgx
order by
t1.ticker,
t1.date
Непростой sql запрос
<date>,<ticker>,<x>,<avgx>
<ticker> - это название акции, значение которой в день <date> равно <x>, <avgx> пустое
для каждого <ticker> надо заполнить <avgx> следующим образом:
<avgx> = среднее значение <x> за последние 30 дней
Долго ломаю голову, наврено это надо делать програмно несколькими запросами, но хочется конечно изящного решения :)
БД Access 2007
спасибо
Код:
работает (даж проверил в акцессе)
в последней колонки ваше среднее значение за 30 дней, если первые записи не имеют запаса по глубине дат в 30 дней - берется среднее по тем что имеется (если нужно чтобы по ним не считалось среднее уберите знак меньше в последнем условии), соотв.первая запись вообще не имеет срднего. остальные колонки - сумма и каунт - оставил просто чтоб понятнее было что делает запрос. Ну и в синтаксисе акцесса я не силен и чес.говоря разбираться не хочу, так что как там делать апдейты из результатов запроса (и можно ли) разберитесь уж сами, в мсскуэль это было бы примерно так
Код:
update t1
set
t1.avgx = avg(t2.x)
from
t t1
left join t t2 on t1.ticker = t2.ticker and t2.date < t1.date and (t1.date - t2.date) <= 30
group by
t1.date,
t1.ticker,
t1.x,
t1.avgx
order by
t1.ticker,
t1.date
set
t1.avgx = avg(t2.x)
from
t t1
left join t t2 on t1.ticker = t2.ticker and t2.date < t1.date and (t1.date - t2.date) <= 30
group by
t1.date,
t1.ticker,
t1.x,
t1.avgx
order by
t1.ticker,
t1.date
но акцесс так просто не сдается там как-то все по-особенному.=)