假设我有一个只包含id
和occurred
列的事件表(这只是一个日期时间)。
我希望在给定时期内每天都能获得前一周的活动数量。所以,假设这个时期是1月1日到4月1日。我希望这个查询的结果如下:
_______________
|count | date |
|------|------|
| 3 | 1/1 |
| 2 | 1/2 |
| 0 | 1/3 |
| 4 | 1/4 |
---------------
对于该日期,count
的位置是前一周发生的事件数。因此,1/1的3
计数是12月25日到1月1日之间发生的事件数。
我可以在代码中轻松地做到这一点:
for (date in 1/1 to 4/1) {
start_date = date - 7 days
db.query(’SELECT COUNT(1) FROm events WHERE occurred > start_date AND occurred < date`)
}
不幸的是,这会导致超过一百个单独的查询。我想在一个查询中弄清楚如何做到这一点。
答案 0 :(得分:1)
嗯,您可以使用generate_series()
生成期间内的所有日期。然后加入数据并做累积总和:
select dd.dte,
sum(cnt) over (order by dd.dte rows between 6 preceding and current date) as avg_7daymoving
from generate_series('2015-01-01'::timestamp, '2015-04-01'::timestamp, '1 day'::interval) dd(dte) left join
(select date_trunc('day', occurred) as dte, count(*) as cnt
from events e
group by date_trunc('day', occurred)
) e
on e.dte = dd.dte