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

如何按Guarantor>Executive>Owner优先级筛选SELECT查询的Relation Code

按Relation Code优先级筛选SQL结果集的实现方案

我来帮你搞定这个按优先级筛选SQL结果的需求~先理清楚你的核心诉求:针对每个PARENTID,按照Guarantor(301) > Executive(201) > Owner(101)的优先级,只保留最高优先级对应的所有数据。

问题场景回顾

现有查询结果集:

PARENTID RELATION_CODE RELATION PERCENTAGE
2628 101 Owner 14%
2628 101 Owner 14%
2628 101 Owner 14%
2628 101 Owner 14%
2628 201 Executive 0
2628 201 Executive 0
2628 201 Executive 0
2628 201 Executive 0
2628 301 Guarantor 17%
2628 301 Guarantor 17%
2628 301 Guarantor 17%
2628 301 Guarantor 17%

期望只保留最高优先级的Guarantor数据:

PARENTID RELATION_CODE RELATION PERCENTAGE
2628 301 Guarantor 17%
2628 301 Guarantor 17%
2628 301 Guarantor 17%
2628 301 Guarantor 17%

两种可行的解决方案

方案一:用窗口函数(通用型,支持MySQL8+、PostgreSQL、SQL Server等)

这种方法简洁高效,通过给不同Relation Code分配优先级分数,再筛选出每个PARENTID下的最高优先级数据:

WITH ranked_data AS (
    SELECT 
        *,
        -- 给关系类型分配优先级:数值越小优先级越高
        CASE RELATION_CODE
            WHEN '301' THEN 1
            WHEN '201' THEN 2
            WHEN '101' THEN 3
        END AS priority,
        -- 计算当前PARENTID下的最高优先级(最小的priority值)
        MIN(CASE RELATION_CODE
            WHEN '301' THEN 1
            WHEN '201' THEN 2
            WHEN '101' THEN 3
        END) OVER (PARTITION BY PARENTID) AS highest_priority
    FROM your_table_name -- 替换成你的实际表名/原查询语句
)
SELECT PARENTID, RELATION_CODE, RELATION, PERCENTAGE
FROM ranked_data
WHERE priority = highest_priority;

原理说明:

  • 先通过CASE给每条数据打优先级标签,Guarantor是1(最高),Executive是2,Owner是3(最低)
  • 用MIN() OVER (PARTITION BY PARENTID)找出当前PARENTID下所有数据里最小的优先级值,也就是我们要保留的最高优先级类型
  • 最后只筛选出优先级等于这个最高值的所有数据,完美匹配你的规则

方案二:兼容低版本SQL(无窗口函数,比如MySQL5.x)

如果你的数据库不支持窗口函数,用子查询先确定每个PARENTID要保留的目标Relation Code,再关联筛选:

SELECT t.*
FROM your_table_name t
JOIN (
    SELECT 
        PARENTID,
        -- 按优先级顺序判断存在的最高级关系类型
        CASE 
            WHEN EXISTS (SELECT 1 FROM your_table_name WHERE PARENTID = t1.PARENTID AND RELATION_CODE = '301') THEN '301'
            WHEN EXISTS (SELECT 1 FROM your_table_name WHERE PARENTID = t1.PARENTID AND RELATION_CODE = '201') THEN '201'
            ELSE '101'
        END AS target_code
    FROM your_table_name t1
    GROUP BY PARENTID
) sub ON t.PARENTID = sub.PARENTID AND t.RELATION_CODE = sub.target_code;

原理说明:

  • 子查询里按优先级顺序检查每个PARENTID下是否存在Guarantor,存在就选301;否则检查Executive,存在就选201;最后默认选Owner的101
  • 然后把原表和这个子查询关联,只保留匹配目标Relation Code的数据

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:21:25