SQL按Key分组获取下一事件 过滤连续重复Event2记录
问题根因梳理
原SQL存在三处核心错误,直接导致结果不符合预期:
- 窗口函数
LEAD未通过PARTITION BY Key做分组,也未按id排序,存在跨Key取值、组内顺序错乱问题,Next_Event计算逻辑完全错误 - 内层子查询仅返回计算出的NEXT_EVENT字段,缺失外层查询需要引用的id、Key、Some_Event字段,外层无法取到对应基础值
- WHERE条件逻辑完全写反:既错误过滤了所有非Event2的记录,也未实现「仅过滤连续重复Event2的后一条记录、将前一条Event2的Next_Event置空」的规则,还错误使用反引号包裹字符串值(反引号是字段/表名标识符,字符串值需用单引号包裹)
正确SQL实现
WITH event_seq AS ( SELECT id, `Key`, Some_Event, -- 按Key分区、id升序取相邻下一条事件,无下一条时默认返回NULL LEAD(Some_Event, 1) OVER (PARTITION BY `Key` ORDER BY id) AS raw_next_event FROM table1 ) SELECT id, `Key`, Some_Event, -- 仅当前事件是Event2且下一个事件也是Event2时,Next_Event置NULL,其余场景保留原始下一个事件值 CASE WHEN Some_Event = 'Event2' AND raw_next_event = 'Event2' THEN NULL ELSE raw_next_event END AS Next_Event FROM event_seq -- 仅过滤「前一条是Event2、当前也是Event2」的重复记录,其余记录全部保留 WHERE NOT ( LAG(Some_Event, 1) OVER (PARTITION BY `Key` ORDER BY id) = 'Event2' AND Some_Event = 'Event2' ) ORDER BY `Key`, id;
逻辑说明
- 先通过CTE按正确的分区、排序规则计算每条记录的原始下一个事件,同时返回所有需要的基础字段,避免内层字段缺失问题
- Next_Event赋值严格匹配规则:只有当前记录和下一条相邻记录都是Event2的场景,才把Next_Event设为NULL,其余场景(包括Event1接Event1、Event2接Event1、Event1接Event2)都正常返回下一个事件值
- 过滤规则精准匹配需求:只排除「紧跟在Event2后面的Event2记录」,例如Key=1分组下id=03的Event2前面是id=02的Event2,这条记录直接不返回;其余所有记录均保留
- 注意
Key是SQL保留关键字,查询时需要用反引号包裹避免语法错误,字符串值统一用单引号包裹
内容的提问来源于stack exchange,提问作者Vassilis
相关产品推荐
相关产品推荐

