我需要将一个条目和另一个条目之间的时间戳差异为 X 秒或小于 X 秒的条目组合在一起,然后对每个设备的每个条目的值进行平均。在下面的示例中,我有一个包含此数据的表,我需要按设备分组,条目之间的间隔在 60 秒之间。
Device Timestamp Value
0 30:8c:fb:a4:b9:8b 10/26/2015 22:50:15 34
1 30:8c:fb:a4:b9:8b 10/26/2015 22:50:46 34
2 c0:ee:fb:35:ec:cd 10/26/2015 22:50:50 33
3 c0:ee:fb:35:ec:cd 10/26/2015 22:50:51 32
4 30:8c:fb:a4:b9:8b 10/26/2015 22:51:15 34
5 30:8c:fb:a4:b9:8b 10/26/2015 22:51:47 32
6 c0:ee:fb:35:ec:cd 10/26/2015 22:52:38 38
7 30:8c:fb:a4:b9:8b 10/26/2015 22:54:46 34
这应该是结果表
Device First_seen Last_seen Average_value
0 30:8c:fb:a4:b9:8b 10/26/2015 22:50:15 10/26/2015 22:51:47 33,5
1 c0:ee:fb:35:ec:cd 10/26/2015 22:50:50 10/26/2015 22:50:51 32,5
2 c0:ee:fb:35:ec:cd 10/26/2015 22:52:38 10/26/2015 22:52:38 38
3 30:8c:fb:a4:b9:8b 10/26/2015 22:54:46 10/26/2015 22:54:46 34
非常感谢您的帮助。
最佳答案
这里面有个老把戏!
主要基于 Window functions 的幂
非常适合 BigQuery!
因此,首先您要“标记”所有在上一次输入之后超过 60 秒的条目!
超出的取值为1,其余取值为0!
其次,你通过总结所有以前的标记来定义组(当然上面的步骤是在按设备分区时完成的)
最后,您只需按上面定义的组进行简单分组
三个简单的步骤在一个查询中实现,只需几个简单的子选择!
希望这有帮助
SELECT device, MIN(ts) AS first_seen, MAX(ts) AS last_seen, AVG(value) AS average_value
FROM (
SELECT device, ts, value, SUM(grp_start) OVER (PARTITION BY device ORDER BY ts) AS grp
FROM (
SELECT device, ts, value,
IF(TIMESTAMP_TO_SEC(TIMESTAMP(ts))-TIMESTAMP_TO_SEC(TIMESTAMP(ts0))>60,1,0) AS grp_start
FROM (
SELECT device, ts, value, LAG(ts, 1) OVER(PARTITION BY device ORDER BY ts) AS ts0
FROM yourTable
)
)
)
GROUP BY device, grp
关于mysql - SQL - 按条目 X 彼此间隔的时间对表进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35250619/