PostgreSQL中每小时的累计经过分钟数

我有一个datetime列。我需要得出从每小时的第一个值到最后一个值经过的总分钟数的列,并按小时分组,但是,如果发生重叠事件,则时间应分配在两个小时之间。还有一种情况是,如果连续两个记录之间的经过时间超过30分钟,则必须将其忽略。

下面,我将分三个阶段进行说明:原始,中级(计算运行总计)和最终阶段。

PostgreSQL中每小时的累计经过分钟数

而且,我计划按小时获取相同的每小时增量数据,因此,如何将其与旧数据正确合并是另一个问题。

样本数据:

transforms.Compose([
    transforms.Resize((state['imgSize'],state['imgSize'])),transforms.RandomHorizontalFlip(),transforms.RandomVerticalFlip(),transforms.RandomRotation(degrees=45),transforms.ToTensor(),transforms.Normalize(mean=[0.485,0.456,0.406],std=[0.229,0.224,0.225])
])

中间层:

 Moves_TS
1/4/2020 10:00
1/4/2020 10:25
1/4/2020 10:42
1/4/2020 10:56
1/4/2020 10:59
1/4/2020 11:02
1/4/2020 11:24
1/4/2020 11:43
1/4/2020 11:55
1/4/2020 12:26
1/4/2020 12:29

最终输出:

Moves_TS    Hour    Running Total
1/4/2020 10:00  10  0
1/4/2020 10:25  10  25
1/4/2020 10:42  10  42
1/4/2020 10:56  10  56
1/4/2020 10:59  10  60
1/4/2020 11:02  11  2
1/4/2020 11:24  11  24
1/4/2020 11:43  11  43
1/4/2020 11:55  11  55
1/4/2020 12:26  12  0
1/4/2020 12:29  12  3
mddxfsh 回答:PostgreSQL中每小时的累计经过分钟数

这是一个有些曲折的空白问题。首先,我将总结30分钟的间隔所定义的“孤岛”:

select min(moves_ts) as start_ts,max(moves_ts) as end_ts
from (select o.*,count(prev_moves_ts) filter (where moves_ts > prev_moves_ts + interval '30 minute') over (order by moves_ts) as grp
      from (select o.*,lag(moves_ts) over (order by moves_ts) as prev_moves_ts
            from original o
           ) o
     ) o
group by grp;

然后,您可以将其与generate_series()配合使用以扩展数据并计算每小时的重叠量:

with islands as (
      select min(moves_ts) as start_ts,max(moves_ts) as end_ts
      from (select o.*,count(prev_moves_ts) filter (where moves_ts > prev_moves_ts + interval '30 minute') over (order by moves_ts) as grp
            from (select o.*,lag(moves_ts) over (order by moves_ts) as prev_moves_ts
                  from original o
                 ) o
           ) o
      group by grp
     )
select hh.hh,sum( least(hh.hh + interval '1 hour',i.end_ts) -
            greatest(hh.hh,i.start_ts)
          ) as duration           
from (select generate_series(date_trunc('hour',min(moves_ts)),date_trunc('hour',max(moves_ts)),interval '1 hour'
                            ) hh
      from original o
     ) hh left join
     islands i
     on i.start_ts < hh.hh + interval '1 hour' and
        i.end_ts >= hh.hh
group by hh.hh
order by hh.hh;

Here是db 小提琴。

,
select 
   MOVES_TS,Hour,TO_CHAR(MOVES_TS,'YYYYMMDDHH') DATEHR,MIN(Moves_TS) over (partition by DATEHR) as MIN_MOVES_TS,(
    DATE_PART('day',MOVES_TS - MIN_MOVES_TS) * 24 +
   DATE_PART('hour',MOVES_TS - MIN_MOVES_TS) * 60 + 
   DATE_PART('minute',MOVES_TS - MIN_MOVES_TS)
   ) as RunningTotal

from dataset

本文链接:https://www.f2er.com/2536494.html

大家都在问