在flink SQL 中 有个表 有SN 检测时间和是否合格三个字段,我需要找到这个SN最大检测时间的两天数据,该怎么写
时间: 2024-10-25 13:13:02 浏览: 9
flink-es7:为了使用Elasticsearch连接器,使用构建自动化工具(如Maven或SBT)的两个项目和带有SQL
在 Apache Flink SQL 中,你可以使用窗口函数(Window Function)来解决这个问题。假设你的表名为 `table_name`,并且列名分别为 `sn`、`detection_time` 和 `is_pass`。你可以按照 SN 列对数据进行分组,并找出每个 SN 最大的检测时间及其前后两天的数据。这可以通过以下查询实现:
```sql
SELECT sn,
detection_time,
is_pass,
ROW_NUMBER() OVER (PARTITION BY sn ORDER BY detection_time DESC) as row_num
FROM (
SELECT sn,
detection_time,
is_pass,
LAG(detection_time, 2) OVER (PARTITION BY sn ORDER BY detection_time) as two_days_before,
LEAD(detection_time, 2) OVER (PARTITION BY sn ORDER BY detection_time) as two_days_after
FROM table_name
) subquery
WHERE row_num = 1 AND detection_time BETWEEN two_days_before AND two_days_after
ORDER BY sn, detection_time;
```
在这个查询中:
- `ROW_NUMBER()` 函数为每个 SN 的行分配唯一的序号,按检测时间降序排列。
- `LAG` 和 `LEAD` 函数用于获取当前行前后的两行检测时间。
- `WHERE` 子句筛选出每条记录是最大检测时间,并且在这两天范围内。
阅读全文