基于postgres中重叠间隔的求和计数

时间:2018-07-19 21:32:50

标签: sql postgresql aggregate-functions

我想每隔两分钟对列进行求和(因此,这将是1,2和2,3和3,4的总和,等等...),但是我不确定如何去关于这样做。

我的数据类似于:

minute           | source | count
2018-01-01 10:00 |    a   | 7
2018-01-01 10:01 |    a   | 5
2018-01-01 10:02 |    a   | 10
2018-01-01 10:00 |    b   | 20
2018-01-01 10:05 |    a   | 12

我想要什么 (例如,第1行+第2行,第2 + 3行,第3行,第4行,第5行)

minute           | source | count
2018-01-01 10:00 |    a   | 12    
2018-01-01 10:01 |    a   | 15
2018-01-01 10:02 |    a   | 10
2018-01-01 10:00 |    b   | 20
2018-01-01 10:05 |    a   | 12

2 个答案:

答案 0 :(得分:0)

您可以使用相关子查询来选择共享源的时间间隔中记录的计数总和(我认为必须匹配源。如果没有,只需删除WHERE中的比较条款。

SELECT "t1"."minute",
       "t1"."source",
       (SELECT sum("t2"."count")
               FROM "elbat" "t2"
               WHERE "t2"."source" = "t1"."source"
                     AND "t2"."minute" >= "t1"."minute"
                     AND "t2"."minute" <= "t1"."minute" + INTERVAL '1 MINUTE') "count"
       FROM "elbat" "t1";

SQL Fiddle

答案 1 :(得分:0)

以上文章假设所有时间戳均为分钟。如果您想全天每2分钟检查一次,可以使用generate_series函数。在每个间隔中包括开始分钟和结束时间的问题将是b在结果中包含2行。

即。

select begintime,
    endtime,
    source, 
    sum(count)
from mytable
inner join (
    select begintime, endtime
    from (
        select lag(time, 1) over (order by time) as begintime, 
            time as endtime
        from (
           select * 
           from generate_series('2018-01-01 00:00:00', '2018-01-02 00:00:00', interval '2 minutes')  time
        ) q 
    ) q2
    where begintime is not null
) times on minute between begintime and endtime
group by begintime, endtime, source
order by begintime, endtime, source

如果您不希望重叠,可以将“开始时间和结束时间之间的分钟”更改为“分钟>开始时间和分钟<=结束时间”