Postgres每小时按数据分组,然后找到max和min createdAt的时间差并计算它们的总和

Postgres group by data hourly,then find the time difference from max and min createdAt and calculate their sum

我有一个这样的 table :

p_id |      createdat      | pagetitle | sessionid |      text       | device  | deviceserial
------+---------------------+-----------+-----------+-----------------+---------+--------------
      | 2020-09-03 06:59:18 |           |           | Approve         | Android | 636363636890
      | 2020-09-03 08:40:10 |           |           | launchComponent | Android | 636363636890
      | 2020-09-03 08:40:11 |           |           | hi              | Android | 6625839827
      | 2020-09-03 08:45:11 |           |           | hi              | Android | 6625839827
      | 2020-09-03 08:43:10 |           |           | launchComponent | Android | 636363636890
      | 2020-09-03 08:50:11 |           |           | hi              | Android | 6625839827
      | 2020-09-03 08:47:10 |           |           | launchComponent | Android | 636363636890
      | 2020-09-03 08:53:11 |           |           | hi              | Android | 6625839827
      | 2020-09-03 08:50:10 |           |           | launchComponent | Android | 636363636890
      | 2020-09-03 08:55:11 |           |           | hi              | Android | 6625839827
      | 2020-09-03 08:52:10 |           |           | launchComponent | Android | 636363636890
      | 2020-09-03 09:00:11 |           |           | hi              | Android | 6625839827
      | 2020-09-03 08:55:10 |           |           | launchComponent | Android | 636363636890
      | 2020-09-03 09:05:11 |           |           | hi              | Android | 6625839827
      | 2020-09-03 08:59:10 |           |           | launchComponent | Android | 636363636890
      | 2020-09-03 09:07:11 |           |           | hi              | Android | 6625839827
      | 2020-09-03 09:01:10 |           |           | launchComponent | Android | 636363636890
      | 2020-09-03 09:09:11 |           |           | hi              | Android | 6625839827
      | 2020-09-03 09:03:10 |           |           | launchComponent | Android | 636363636890
      | 2020-09-03 09:09:11 |           |           | hi              | Android | 6625839828
      | 2020-09-03 09:03:10 |           |           | launchComponent | Android | 636363636891
      | 2020-09-03 09:13:11 |           |           | hi              | Android | 6625839828

我想每小时对数据进行分组,deviceserial.Then 从每小时的 createdAt 中找到最大值和最小值,然后计算总和。 那是我试过的查询:

Select deviceserial,DATE_PART('minute', max(createdat)::timestamp - min(createdat)::timestamp) AS time_difference,date_part('hour', createdat) as hr FROM json_table2  GROUP BY deviceserial,hr;

这是我的结果:

deviceserial | time_difference | hr
--------------+-----------------+----
 636363636891 |               3 |  9
 6625839832   |               0 | 11
 636363636890 |               0 |  6
 636363636890 |              19 |  8
 6625839830   |               0 | 10
 6625839830   |               0 | 12
 6625839835   |               0 | 10
 6625839833   |               0 | 12
 6625839828   |               4 |  9
 6625839832   |               0 | 10
 6625839835   |               0 | 11
 636363636890 |               2 |  9
 6625839827   |               9 |  9
 6625839833   |               0 | 11
 6625839827   |              15 |  8

我想找到类似 this.It 的时间差总和 (createdAt differences) groupby deviceserial:

deviceserial | time_difference | 
--------------+-----------------+----
 636363636890 |              21 |   
 6625839827   |              24 | 

And for other values as well...

这里我试图找到不同deviceSerial的设备使用情况。

如果我没听错,那是在现有查询之上的另一个聚合级别:

select deviceserial, sum(time_difference) as time_difference
from (
    select deviceserial,
        date_part('minute', max(createdat)::timestamp - min(createdat)::timestamp) as time_difference,
        date_trunc('hour', createdat) as hr 
    from json_table2  
    group by deviceserial, hr
) t
group by deviceserial

我将查询更改为使用 date_trunc() 而不是 date_part():后者将不同日期同一时间发生的记录一起计算,我认为您不需要。

虽然这可能会回答您的直接问题,但我想知道结果有多大用处。您可能想问另一个问题,从一开始就解释您要做什么。

使用二级聚合。

SELECT deviceserial,
       sum(time_difference) time_difference
       FROM (SELECT deviceserial,
                    extract(epoch FROM max(createdat) - min(createdat)) time_difference,
                    FROM json_table2
                    GROUP BY deviceserial,
                             date_part('hour', createdat)) x
       GROUP BY deviceserial;

如果您想要以分钟为单位的间隔长度,而不仅仅是其中的分钟部分,则最好使用 extract() 而不是 date_part()。 (即使两者都产生相同的结果这里,因为最小值和最大值最多相隔一个小时。但是如果你有一天选择将分组更改为例如按天,你会得到错误的结果,一开始可能甚至不会注意到。)

如果 createdat 已经是合适的类型,您可能不需要转换 min()max()