Выбор сгруппированного условия в совокупном запросе - PullRequest
0 голосов
/ 23 ноября 2010

У меня есть представление, которое усредняет некоторую статистику, усредняя последние строки относительно к текущему внешнему ряду. Подумайте о среднем уровне за каждый предыдущий битой для каждого теста. Это работает, как я хотел бы, но я хотел бы больше контроля над 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

(Ментат вымышлен, поскольку я теряю его вместе с группой)

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

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

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

Ответы [ 2 ]

1 голос
/ 23 ноября 2010

Я понял это :)

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 голосов
/ 23 ноября 2010

Попробуйте использовать предложение, имеющееся здесь:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...