sql - 在SQL中如何找到在几秒钟内彼此分开的数据行
问题描述
我有一个记录传感器事件的表。并且在随机时间每小时选择一个随机日志进行测试。我想找到每个小时采摘的 T 秒内的 N 个事件。
数据看起来像这样
eventID eventTs picked_for_testing
123 2021-04-01 13:21:45 0
3532 2020-12-16 08:31:12 1
987341 2021-04-01 13:21:41 1
事件 1 和 3 都在 4 秒内发生。我想找到在 10 秒内发生的所有此类事件。
我能够通过对所有选定事件与未选定事件进行交叉连接来获得它,然后在 eventT 之间进行时间差异,然后对其进行过滤。但由于数据中的事件数量,它花费的时间太长。
有更好的方法吗?
解决方案
对于该要求,BigQuery 分析功能似乎是可行的方法。特别是导航功能。
在不知道您正在寻找的确切结果的情况下,很难给您一个正确的查询。我假设您只需要具有以下架构的表:
eventID, next_eventID_within_10
所以,这个查询将完成这项工作:
WITH data as (
SELECT 123 as eventID, timestamp("2021-04-01 13:21:45") as eventTs, 0 as picked_for_testing
UNION ALL
SELECT 3532 as eventID, timestamp("2020-12-16 08:31:12") as eventTs, 1 as picked_for_testing
UNION ALL
SELECT 987341 as eventID, timestamp("2021-04-01 13:21:41") as eventTs, 1 as picked_for_testing
UNION ALL
SELECT 87345874 as eventID, timestamp("2021-04-01 13:21:49") as eventTs, 1 as picked_for_testing)
, tmp as (
SELECT
eventID,
picked_for_testing,
eventTs,
IF(TIMESTAMP_DIFF(LEAD(eventTs) OVER (ORDER BY eventTs), eventTs, SECOND) <= 10, LEAD(eventID) OVER (ORDER BY eventTs), Null) as next_eventID_within_10
FROM data)
SELECT eventID, next_eventID_within_10
FROM tmp
WHERE next_eventID_within_10 IS NOT NULL
推荐阅读
- php - 如何更改 WooCommerce 我的帐户页面标题?
- r - 计算多个组中的共享和唯一标记
- linux - 计算Linux打开文件限制?
- javascript - 有人能解释一下这个简单函数中字母“m”到底代表什么吗?
- influxdb - InfluxDB 查询带有特定附加标签的标签值
- javascript - 如何检测文本输入上的退格键更改?
- c# - 如何将大对象发布到 Web api
- node.js - 我如何告诉 Babel CLI 忽略任何带有“__”的路径?
- c# - 我可以将训练有素的模型保存在 Accord.NET 中吗
- python - 在列而不是 DataFrame 的行中表达时间序列数据