在 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 函数,获取“查询没有结果数据的目的地”,不想使用表结果类型