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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 19:33:16