sql - Postgres 每小时按数据分组,然后找到 max 和 min createdAt 的时间差并计算它们的总和
问题描述
我有一张这样的桌子:
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
我想按小时和设备序列对数据进行分组。然后从每小时 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
我想找到这样的东西。这将是时间差异的每小时总和(createdAt 差异)groupby 设备序列:
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()
: 后者将不同日期同一时间发生的记录一起计算,我认为您不希望这样做。
虽然这可能会回答您的直接问题,但我想知道结果有多大用处。您可能想问另一个问题,从一开始就解释您要做什么。
推荐阅读
- chatbot - 在 BLiP 中,一条调度消息有效,但同时多条消息无效
- webfonts - 如何使用 Webpack Encore 和 webfonts-loader 预加载字体?
- c# - 伪控制台 (ConPTY) 的输出被 Visual Studio 调试输出窗口吃掉
- google-cast - 如何使用新的 androidx 库获得 chromecast 支持
- mongodb - MongoDB:如何投影单个文档的所有字段类型?
- c - 子进程在 Linux 平台上的 C 中获取时丢失
- r - recode_factor 不能替换缺失值
- zapier - Zapier 中的状态输出到 UF 的 Javascript 代码
- c# - 从 C# Web API 返回 DataTable 对象是否存在内存泄漏问题
- charts - 具有多个列角色的 Google 时间轴图表