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

如何删除SQL表中typ=1与后续首个typ=2之间的所有行

解决方案:删除typ=1与紧随其后typ=2之间的行

这问题我帮你搞定了,咱们先明确核心需求:按id排序后,要移除所有夹在typ=1的行和它之后第一个typ=2的行之间的所有行,同时保留typ=1、typ=2本身,以及不在这个区间里的其他行。

我用CTE结合窗口函数来实现这个逻辑,代码如下:

DECLARE @tb1 AS TABLE (id INT, typ INT) 
INSERT INTO @tb1 ( id, typ ) 
VALUES (1,1),(2,3),(3,2),(4,3),(5,1),(6,2),(7,3),(8,3),(9,1) ,(10,3),(11,3),(12,3),(13,2),(14,3),(15,1)

WITH Typ1NextTyp2 AS (
    SELECT 
        id AS typ1_id,
        -- 定位当前typ=1行之后第一个typ=2的id
        LEAD(CASE WHEN typ = 2 THEN id END) OVER (ORDER BY id) AS next_typ2_id
    FROM @tb1
    WHERE typ = 1
),
FilterIntervals AS (
    -- 只保留有后续typ=2的区间(排除最后一个没有typ=2跟进的typ=1行)
    SELECT typ1_id, next_typ2_id
    FROM Typ1NextTyp2
    WHERE next_typ2_id IS NOT NULL
)
SELECT t.id, t.typ
FROM @tb1 t
WHERE 
    -- 直接保留typ=1和typ=2的行
    t.typ IN (1,2)
    OR
    -- 保留不在任何typ1与对应typ2之间的行
    NOT EXISTS (
        SELECT 1
        FROM FilterIntervals fi
        WHERE t.id > fi.typ1_id AND t.id < fi.next_typ2_id
    )
ORDER BY t.id;

代码逻辑拆解:

  1. Typ1NextTyp2 CTE:先筛选出所有typ=1的行,用LEAD窗口函数跳过中间非typ=2的行,直接抓取该行之后第一个typ=2的id。
  2. FilterIntervals CTE:过滤掉那些没有后续typ=2的typ=1行(比如最后一行id=15,后面没有typ=2,所以不需要处理它的区间)。
  3. 主查询:分两类保留行:
    • 本身就是typ=1或typ=2的行;
    • id不在任何(typ1_id, next_typ2_id)区间内的行。

运行这段代码后,就能得到你期望的结果:

id          typ
----------- -----------
1           1
3           2
4           3
5           1
6           2
7           3
8           3
9           1
13          2
14          3
15          1

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:38:44