繁体   English   中英

如何在 PostgreSQL 中按时间间隔汇总行数?

[英]How can I aggregate a count of rows by time intervals in PostgreSQL?

如果我有一个 PostgreSQL 表,其中包含日期时间列和项目数组,例如:

| time                       | items                  |
| -------------------------- | ---------------------- |
| 2020-12-06 11:31:38.000    |  {item1, item2}        |
| 2020-12-06 11:48:11.304    |  {item1}               |
| 2020-12-06 11:48:48.654    |  {item1, item2, item3} |
| 2020-12-06 11:49:50.355    |  {item2}               |
| 2020-12-06 11:55:31.842    |  {item1, item2}        |

如何查询表以在等距时间间隔内聚合特定项目的计数?

例如,我想每隔 5 分钟统计item1的出现次数,这样查询结果如下所示:

| start_time                 | end_time                            | item1 count     |
| -------------------------- | ----------------------------------- | --------------- |
| 2020-12-06 11:30:00.000    |  2020-12-06 11:34:99.999            |       1         |
| 2020-12-06 11:35:00.000    |  2020-12-06 11:39:99.999            |       0         |
| 2020-12-06 11:40:00.000    |  2020-12-06 11:44:99.999            |       0         |
| 2020-12-06 11:45:00.000    |  2020-12-06 11:49:99.999            |       2         |
| 2020-12-06 11:50:00.000    |  2020-12-06 11:54:99.999            |       0         |
| 2020-12-06 11:55:00.000    |  2020-12-06 11:59:99.999            |       1         |

我很难弄清楚什么查询可以帮助我以最佳方式实现这一目标。 我一直在想 Postgres 的date_truncgrid可能会对此有所帮助,但我真的不确定如何解决这个问题。 有什么建议么?

您可以使用generate_series()来生成时间戳。 然后取消嵌套、过滤和聚合:

select gs.ts, count(i.time) as num_item1
from generate_series('2020-12-06 11:30:00.000'::timestamp, '2020-12-06 11:55:00.000', interval '5 minute') gs(ts) left join
     (items i join lateral
      unnest(i.items) item
      on item = 'item1'
     )
     on i.time >= gs.ts and i.time < gs.ts + interval '5 minute'
group by gs.ts
order by 1;

是一个 db<>fiddle。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM