如何获得特定时期内每天的尾随周数(在Postgres上)?

时间:2015-04-24 00:39:16

标签: sql postgresql

假设我有一个只包含idoccurred列的事件表(这只是一个日期时间)。

我希望在给定时期内每天都能获得前一周的活动数量。所以,假设这个时期是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`)
}

不幸的是,这会导致超过一百个单独的查询。我想在一个查询中弄清楚如何做到这一点。

1 个答案:

答案 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