首页 > 解决方案 > 如何在满足条件的行的时间段内选择带有时间戳的行

问题描述

+-----------+-----------+----------+
| 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 查询吗?

标签: sqlgoogle-bigquery

解决方案


反转问题并在每个错误前 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子句过滤掉了。


推荐阅读