SQL需求:基于行为标记筛选数据,仅保留符合条件的Good行
解决SQL行标记与筛选问题
核心逻辑
- 按日期分区,针对每行判断同日期内的前序行是否存在
animal值 - 仅保留满足「前序有animal」且「当前值是cat/dog」的行,标记为
Good
SQL 实现代码
假设你的表名为target_table,日期列是event_date,值列是tag,且有row_id作为行顺序的依据(如果没有,替换为业务上能确定行先后的字段,比如数据插入时间insert_time):
WITH pre_marked AS ( SELECT event_date, tag, -- 计算当前行之前(同日期内)是否出现过'animal' MAX(CASE WHEN tag = 'animal' THEN 1 ELSE 0 END) OVER (PARTITION BY event_date ORDER BY row_id ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS has_prev_animal, -- 判断当前行是否是目标值 CASE WHEN tag IN ('cat', 'dog') THEN 1 ELSE 0 END AS is_target FROM target_table ) SELECT event_date, tag, 'Good' AS flag FROM pre_marked WHERE has_prev_animal = 1 AND is_target = 1;
关键细节解释
PARTITION BY event_date:把数据按日期拆分成独立组,只在同日期内判断前序行ORDER BY row_id:必须指定行的排序规则,否则"前序列"没有明确意义,要根据你的实际数据替换成正确的排序字段ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING:严格限定窗口范围是当前行的所有前序行,不包含当前行本身,避免把当前行的animal算进去- 用CTE先做中间标记,再筛选结果,逻辑更直观,也方便调试中间状态
边界场景覆盖
- 同一日期内
animal在最后一行:后续无cat/dog,不会产生Good行 - 同一日期内cat/dog在animal之前:会被排除,符合规则
- 同一日期内多次出现animal:只要前序出现过一次,后续所有cat/dog都会被标记为Good
内容的提问来源于stack exchange,提问作者Algoritmi
相关产品推荐
相关产品推荐

