You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 20:27:19