我有一个观点,通过平均过去的行相对来平均一些统计数据 到当前的外排。想想每个击球手每次击球的击球率。这可以按照我的意愿工作,但我想更多地控制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天,或任何我想要的日期。内部查询中的旧日期,因此一旦创建视图,我就无法访问它。
答案 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