2010-11-23 3 views
0

У меня есть представление, которое усредняет некоторые статистические данные путем усреднения последних строк относительно в текущей внешней строке. Подумайте о среднем уровне ватин для каждого предыдущего в летучей мыши для каждого теста. Это работает, как хотелось бы, но я хотел бы больше контроля над old_foo.datesВыбор сгруппированного условия в сводном запросе

Мнения идеализированные запрос выглядит так:

create view myview as 
select 
    avg(old_foo.stuff), 
    foo.person_id, 
    foo.date_ as this_date 

from 
    foo, 
    join (select stuff, person_id, date_ from foo) as old_foo 
     on old_foo.date_ < foo.date_ 

group by person_id, this_date 
; 

Но я бы очень хотел, чтобы быть в состоянии минимальный набор old_foo.date из вид, чтобы я мог создать произвольно скользящие средние на лету.

Такие, как:

select * from myview where mindate > now()::date - 10 

(MinDate фиктивно, так как я потерял его с группой по)

Я знаю, что могу сделать это с помощью функции, но я предпочел бы не слишком. Будет ли CTE давать мне больше гибкости с тем, что я хочу?

редактировать

Я не могу привести oldate столбец верхнего уровня зрения без группировки его (это не то, что я хочу.) Я хочу, чтобы вид быть вообще, так что я мог бы так же, как легко сделать 10-дневную скользящую среднюю как 20-дневную или любую дату, которую я бы хотел. Старые даты во внутреннем запросе, поэтому я не имею доступа к нему, как только создаю представление.

ответ

1

Я понял это :)

create view myview as 
select 
    avg(old_foo.stuff), 
    foo.person_id, 
    foo.date_ as this_date, 
    offset 
from 
    generate_series(1, 100) as offset, 
    foo, 
    join (select stuff, person_id, date_ from foo) as old_foo 
     on old_foo.date_ < foo.date_ 
     and old_foo.date_ > foo.date_ - offset 

group by person_id, this_date, offset 
; 


select * from myview where offset = 10; 

Тогда смещение будет имитировать параметр функции.

0

Try с использованием имеющего пункт здесь некоторые ссылки

http://www.postgresql.org/docs/8.1/static/tutorial-agg.html

Я считаю, что это будет выглядеть примерно так.

create view myview as 
select 
    avg(old_foo.stuff), 
    foo.person_id, 
    foo.date_ as this_date 

from 
    foo, 
    join (select stuff, person_id, date_ from foo) as old_foo 
     on old_foo.date_ < foo.date_ 

group by person_id 
having min(foo.date_) <= now() - 10 
+0

Я не хочу жестко кодировать условие в представлении. – 2010-11-23 01:35:16

Смежные вопросы