在聚合查询中选择分组条件

时间:2010-11-23 01:22:59

标签: sql postgresql

我有一个观点,通过平均过去的行相对来平均一些统计数据 到当前的外排。想想每个击球手每次击球的击球率。这可以按照我的意愿工作,但我想更多地控制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会给我更多的灵活性吗?

修改

我不能将旧的列放到视图的顶层而不对其进行分组(这不是我想要的。)我希望视图是通用的,所以我可以轻松地将10天移动平均值作为20天,或任何我想要的日期。内部查询中的旧日期,因此一旦创建视图,我就无法访问它。

2 个答案:

答案 0 :(得分: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;

然后偏移将模拟一个函数参数。

答案 1 :(得分:0)

尝试在这里使用having子句是一些参考

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