如何按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
相关产品推荐
相关产品推荐

