如何在SQL存储过程中过滤结果集,优先保留旧类型记录
解决up_Select_Details_test存储过程的类型优先级过滤问题
针对你要实现的逻辑——保留所有'F'类型记录,同时在同一Code、Number、Reference组合下优先保留'T'类型,无'T'则保留'A'类型,用窗口函数就能高效解决,具体步骤如下:
1. 先把Union All结果存入表变量(你已完成这部分,补全示例)
DECLARE @TempData TABLE ( Code VARCHAR(50), Number INT, Reference VARCHAR(50), Type CHAR(1), -- 替换成你实际需要的其他字段 Col1 VARCHAR(100), Col2 DATETIME ); -- 原Union All逻辑+新增的'A'分支 INSERT INTO @TempData SELECT Code, Number, Reference, Type, Col1, Col2 FROM YourTable WHERE Type = 'F' UNION ALL SELECT Code, Number, Reference, Type, Col1, Col2 FROM YourTable WHERE Type = 'T' UNION ALL SELECT Code, Number, Reference, Type, Col1, Col2 FROM YourTable WHERE Type = 'A';
2. 用CTE+窗口函数实现优先级过滤
WITH RankedRecords AS ( SELECT *, -- 给T/A设置优先级:T排1,A排2;F的排序值不影响,后续单独筛选 ROW_NUMBER() OVER ( PARTITION BY Code, Number, Reference ORDER BY CASE Type WHEN 'T' THEN 1 WHEN 'A' THEN 2 ELSE 0 END ) AS PriorityRank FROM @TempData ) -- 筛选结果:所有F类型保留,T/A只留每组优先级最高的第一条 SELECT Code, Number, Reference, Type, Col1, Col2 FROM RankedRecords WHERE Type = 'F' OR PriorityRank = 1;
逻辑说明
PARTITION BY Code, Number, Reference:按你指定的键分组,确保只在同组内判断优先级CASE语句定义优先级:'T'的优先级高于'A',所以同组内'T'会被标记为PriorityRank=1,'A'则为2- WHERE条件:直接保留所有
'F'类型,同时只取T/A分组里的第一条(也就是优先级最高的记录),自动过滤掉同组中被T覆盖的'A'记录
如果同组内存在多条相同Type的记录(比如多个'T'),这个逻辑会保留第一条;如果需要保留所有'T',把ROW_NUMBER()换成RANK()即可。
内容的提问来源于stack exchange,提问作者varun
相关产品推荐
相关产品推荐

