sql - 如何在满足条件的行的时间段内选择带有时间戳的行
问题描述
+-----------+-----------+----------+
| TIMESTAMP | MACHNE_NO | ERR_CODE |
+-----------+-----------+----------+
| 9:00:00.0 | 17 | 100 |
| 9:00:00.1 | 15 | 58 |
| 9:00:00.1 | 17 | 68 |
| 9:00:01.5 | 9 | 18 |
| 9:00:01.6 | 9 | 100 |
| 9:00:01.9 | 9 | 95 |
| 9:00:02.7 | 15 | 18 |
| 9:00:02.8 | 17 | 18 |
| 9:00:03.2 | 17 | 22 |
+-----------+-----------+----------+
我有类似上面的数据,我想在机器具有 ERR_CODE 100 后三秒选择包含错误的行。所以在我显示的表中,应该为机器 17 选择第 3 行和第 8 行,为机器选择第 5 行机器 9. 任何人都可以向我展示一个可以执行此操作的 SQL 查询吗?
解决方案
反转问题并在每个错误前 3 秒内查找错误代码 100。为此,请使用窗口函数和过滤。对于有错误的行:
select t.*
from (select t.*,
countif(err_code = 100) over (
partition by machine_no
order by unix_seconds(timestamp)
range between 3 preceding and current row
) as cnt_100
from t
) t
where cnt_100 > 0 and err_code <> 100;
请注意,任何带有的行都err_code = 100
将满足countif()
条件。但是,那些被外部where
子句过滤掉了。
推荐阅读
- java - Spring Data JPA 实现 Persistable 导致 InvalidDataAccessApiUsageException:分离的实体传递给持久化
- terraform - 具有两个以上列表的 Terraform setproduct 函数
- spring-boot - Spring security和jpa中的自定义登录页面
- javascript - 如何使用“onchange”获得即时响应?
- python - 在 JSONField 中搜索文本
- jquery - 如何从 jquery 对象集合中删除 jquery 对象?
- php - 我如何简化和加快 3 个查询,每个查询都基于下一个?
- python - MySQL & Python:并非所有参数都在 SQL 语句中使用
- multithreading - Scala Futures 如何在线程上运行?以及如何使用它们来执行异步和非阻塞代码?
- c++ - 如何将张量列表转换为 Torch::Tensor?