按优先级为每个PartyID筛选唯一账户行(Chequing优先)
按账户优先级筛选数据的SQL修复方案
问题分析
你需要为每个PartyID筛选账户行:优先选择Chequing类账户,无Chequing时选Savings类账户。但用MIN()聚合的写法在PartyID E上失效——返回了Business Savings而非目标的Chequing账户,本质是MIN()依赖字符串字典序排序,和你定义的业务优先级不匹配,导致结果不符合预期。
正确解法:用窗口函数按优先级排序
别依赖聚合函数碰运气,直接用ROW_NUMBER()给每个PartyID下的账户按业务规则排号,取第一行即可,这是最稳妥的实现方式:
完整SQL语句
WITH ranked_accounts AS ( SELECT PartyID, Description, Number, ROW_NUMBER() OVER ( PARTITION BY PartyID ORDER BY -- 按业务优先级赋值:Chequing系列排1,Savings系列排2 CASE WHEN Description LIKE '%Chequing%' THEN 1 WHEN Description LIKE '%Savings%' THEN 2 ELSE 3 -- 兜底处理未定义的账户类型 END ) AS rank_num FROM your_table ) SELECT PartyID, Description, Number FROM ranked_accounts WHERE rank_num = 1;
逻辑说明
PARTITION BY PartyID:将数据按每个PartyID拆分为独立分组,分别处理ORDER BY CASE:明确指定优先级规则,所有含Chequing关键词的账户排最前,含Savings的排其后,完全不受字符串排序干扰ROW_NUMBER():给每组内的行按上述规则编序号,取rank_num=1的行就是该PartyID的目标账户
如果你的账户类型是固定的几个值,也可以把CASE条件写得更精准:
ORDER BY CASE Description WHEN 'Chequing' THEN 1 WHEN 'Business Chequing' THEN 1 WHEN 'Savings' THEN 2 WHEN 'Business Savings' THEN 2 END
这种写法能严格遵循你定义的优先级筛选账户,彻底解决PartyID E的异常问题。
内容的提问来源于stack exchange,提问作者seequill
相关产品推荐
相关产品推荐

