如何删除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;
代码逻辑拆解:
Typ1NextTyp2CTE:先筛选出所有typ=1的行,用LEAD窗口函数跳过中间非typ=2的行,直接抓取该行之后第一个typ=2的id。FilterIntervalsCTE:过滤掉那些没有后续typ=2的typ=1行(比如最后一行id=15,后面没有typ=2,所以不需要处理它的区间)。- 主查询:分两类保留行:
- 本身就是
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
相关产品推荐
相关产品推荐

