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

SQL场景:如何筛选前一状态为inprog且当前状态非active的SID

找出前一状态为'inprog'且当前状态非'active'的sid

方法一:使用窗口函数(推荐,简洁高效)

利用LAG()窗口函数直接获取每个状态的前序状态,实现逻辑如下:

SELECT DISTINCT sid
FROM (
    SELECT 
        sid,
        status,
        -- 按sid分组、时间升序,获取当前状态的前一个状态
        LAG(status) OVER (PARTITION BY sid ORDER BY status_dt) AS prev_status
    FROM t1
) AS status_sequence
-- 筛选前一状态是'inprog'且当前状态不是'active'的记录
WHERE prev_status = 'inprog' AND status != 'active';

方法二:自关联表(兼容不支持窗口函数的数据库)

如果你的数据库不支持窗口函数,可以通过自关联匹配紧邻的前后状态:

SELECT DISTINCT t_current.sid
FROM t1 AS t_current
JOIN t1 AS t_prev 
    ON t_current.sid = t_prev.sid 
    AND t_current.status_dt > t_prev.status_dt
    -- 确保两个状态之间无中间记录,保证是紧邻的前后序
    AND NOT EXISTS (
        SELECT 1 FROM t1 AS t_mid 
        WHERE t_mid.sid = t_current.sid 
        AND t_mid.status_dt > t_prev.status_dt 
        AND t_mid.status_dt < t_current.status_dt
    )
WHERE t_prev.status = 'inprog' AND t_current.status != 'active';

两种方法都会返回符合条件的sid列表,比如示例数据中会返回451(它在'inprog'之后的状态是'hold',不符合'active'要求)。

内容的提问来源于stack exchange,提问作者RB49

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 05:25:20