如何通过SQL查询实现行数据trigger字段的交替模式(去重连续重复值)
处理连续重复的trigger字段数据:保留有效交替记录
核心思路
利用窗口函数LAG()或LEAD()对比相邻记录的trigger值,标记出连续重复的无效记录,最后过滤保留有效记录即可。
具体实现(以SQL为例)
假设你的数据表名为event_logs,包含date_time(时间字段,需按此排序)和trigger(取值为start/stop)两个字段:
场景1:保留连续重复中的第一条(匹配你的示例需求)
比如连续3条stop记录,只保留和前一个start配对的第一条stop:
WITH marked_events AS ( SELECT date_time, trigger, -- 对比当前trigger与上一条是否相同,不同则标记为有效 CASE WHEN LAG(trigger) OVER (ORDER BY date_time) = trigger THEN 0 ELSE 1 END AS is_valid FROM event_logs ) SELECT date_time, trigger FROM marked_events WHERE is_valid = 1 ORDER BY date_time;
逻辑说明:
LAG(trigger) OVER (ORDER BY date_time)按时间顺序取出上一条记录的trigger值- 如果当前
trigger和上一条相同,说明是连续重复,标记为0(无效);反之标记为1(有效) - 最后筛选出有效记录,就得到了严格交替的
start/stop序列
场景2:保留连续重复中的最后一条
如果需求是保留连续重复的最后一条(比如连续3条stop,只留最后一条等待下一个start),可以改用LEAD()函数:
WITH marked_events AS ( SELECT date_time, trigger, -- 对比当前trigger与下一条是否相同,不同则标记为有效 CASE WHEN LEAD(trigger) OVER (ORDER BY date_time) = trigger THEN 0 ELSE 1 END AS is_valid FROM event_logs ) SELECT date_time, trigger FROM marked_events WHERE is_valid = 1 ORDER BY date_time;
扩展说明
如果数据需要按某个维度分组处理(比如多个设备的独立事件序列),只需在窗口函数中添加PARTITION BY子句,例如:
LAG(trigger) OVER (PARTITION BY device_id ORDER BY date_time)
这样每个设备的事件序列会单独处理交替逻辑。
内容的提问来源于stack exchange,提问作者Bill Smith
相关产品推荐
相关产品推荐

