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()
。
我有一个这样的 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()
。