【问题标题】:How to aggregate specific rows in PostgreSQL? [duplicate]如何聚合 PostgreSQL 中的特定行? [复制]
【发布时间】:2015-05-12 18:53:37
【问题描述】:

我是 PostgreSQL 的新手,我想知道如何在一个表中聚合 15 分钟的间隔。

例如:

Table:
time: count
9:01    1
9:05    2
9:13    3 
9:20    4
9:21    3
9:35    3

Output:
time          count
9:00 - 9:15    6
9:15 - 9:30    7
9:30 - 9:45    3

【问题讨论】:

标签: postgresql


【解决方案1】:

我假设您的时间列是一个实际的日期时间字段,而不仅仅是一个文本字段。

要计算事件发生在哪个季度,只需使用 date_trunc 将时间字段截断到最接近的小时即可。然后,通过将分钟部分除以 15 并将其铺平来计算它落入哪个季度。之后,您可以使用间隔来计算开始/结束时间。

前:2015 年 5 月 12 日 19:46:41。
将其截断为小时,您将得到 2015 年 5 月 12 日 19:00:00。
计算季度是 floor(46/15) = 3
开始时间 = 2015 年 5 月 12 日 19:00:00 + 间隔“15 分钟”* 3(即 19:45)
结束时间= 2015 年 5 月 12 日 19:00:00 + 间隔 '15 分钟 -1 秒' * 4(即 19:59)

现在,您有了开始时间和结束时间以及操作计数。您所要做的就是将它们分组并将它们汇总在一起。

使用如下表结构,

create table events (
    time timestamp,
    actions integer
);

运行以下查询将为您提供您正在寻找的数据。

SELECT start_time, end_time, sum(actions), count(*)
FROM (
  SELECT 
    date_trunc('hour',time) + (interval '15 minutes'*floor(date_part('minute',time)/15)) as start_time, 
    date_trunc('hour',time) + (interval '15 minutes -1 second'*(floor(date_part('minute',time)/15)+1)) as end_time,
    actions
   from events
) as interval_actions
group by start_time, end_time;

我在sql fiddle 中为你模拟了这个。
documentation 中列出了 postgres 的日期时间函数。

【讨论】:

    猜你喜欢
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    • 2019-05-06
    • 2019-09-09
    • 2016-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多