mysql - SQL - 按条目 X 彼此间隔的时间对表进行分组

标签 mysql sql google-bigquery

我需要将一个条目和另一个条目之间的时间戳差异为 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/

相关文章:

MySQL 连接超时 - MySQL 服务器已经消失(Sinatra、ActiveRecord)

mysql - 试图找到与 MySQL 等效的 iSeries SQL 命令。特别是 "LABEL ON"命令

MySQL 跨两个表进行搜索

sql - 在sql中,多次使用子查询的最佳语法

SQL 总和按字段与所有行分组

google-bigquery - 有没有办法查看 BigQuery 用户运行的查询处理了多少数据?

php - 如何在 MySQL 查询中返回相关字段而不是引用编号

mysql - 如何比较位于不同系统(BigQuery 和 MySQL)中的具有复合键的两个表?

sql - 更新 BigQuery 表中 ARRAY 中的值

c# - 从文件中解析并执行Sql语句