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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 02:17:22