在 postgres 中,如何从事件日志类型表(具有时间戳)中获取特定时间范围内字段的总和(或汇总)

Posted

技术标签:

【中文标题】在 postgres 中,如何从事件日志类型表(具有时间戳)中获取特定时间范围内字段的总和(或汇总)【英文标题】:In postgres how to get sum (or rollup) of a field within certain time range from a event log type table (which has timestamp) 【发布时间】:2016-07-26 18:27:11 【问题描述】:

我有一张表,里面有这样的数据

event_type event_cnt timestamp
abc         2          2016-1-1 20:08:01
abc         3          2016-1-1 20:10:01
xyz        10          2016-1-1 20:10:01
abc         1          2016-1-1 20:15:01
xyz         5          2016-1-1 20:30:01
xyz         5          2016-1-1 20:31:01 

我想要一个结果,它是 2 分钟内 event_cnt 的总和(集群)。

event_type  event_cnt_within_2_min
abc   5 (which is 2+3 in two minutes)
xyz   10 
abc   1
xyz   10 (which is 5+5 in two minutes) 

我认为可能有一种方法可以使用分析功能来解决这个问题,但我还不能找到可行的解决方案。

【问题讨论】:

如果你在 10 分钟内每分钟都有一个事件怎么办?是否应该成为一条记录,或者您将如何将这些记录分成组? 是的,这将是一个记录和所有记录的总和。只要记录在 2 分钟之内,就会被汇总。我在示例中添加了event_type 以简化问题。 【参考方案1】:

您可以使用前导功能检查下一个事件是否在接下来的 2 分钟内插入。

    select event_type,
           sum(case when datediff(minute,timestamp,lead_timestamp)<=2 then lead_event_cunt else 0 end) + 
           sum(event_cnt) as event_cunt_within_2_min
    from(       
    select event_type,event_cnt,timestamp,
           lead (timestamp,1) over (partition by event_type order by timestamp) as lead_timestamp,
           lead (event_cunt,1) over (partition by event_type order by timestamp) as lead_event_cunt,
    from mytable)
    group by 1

【讨论】:

谢谢!小修正效果很好:应该是LEAD(timestamp,1) 你的权利,我之前没有检查脚本,我会更新它

以上是关于在 postgres 中,如何从事件日志类型表(具有时间戳)中获取特定时间范围内字段的总和(或汇总)的主要内容,如果未能解决你的问题,请参考以下文章

在 Postgres 中,如何在更改表后重新验证(“类型检查”)函数和过程?

Postgres tsrange,按日期和时间过滤

如何根据事件日志表在一天结束时获取每个状态的用户总数?

Postgres 函数,获取“查询没有结果数据的目的地”,不想使用表结果类型

如何在 CREATE TYPE 中使用原始 Postgres 输入/输出函数?

R:如何使用 dplyr(函数 scr_postgres)从 redshift 中的模式中选择表?