SQL同用户多行情境下CASE语句返回首个匹配结果问询
解决方案
核心逻辑
CASE语句本身是逐行匹配首个为真的条件,所以同一个用户的多行数据都会独立计算导致重复输出。要实现每个用户仅返回唯一的首个匹配结果,只需按用户维度分组,按CASE的优先级取最高匹配结果即可。
通用窗口函数实现(兼容MySQL8+、PostgreSQL、Spark SQL、Hive等绝大多数SQL环境)
WITH user_case_rank AS ( SELECT user_id, -- 按CASE匹配顺序标记优先级,数值越小优先级越高 CASE WHEN [你的Case1判定条件] THEN 1 WHEN [你的Case2判定条件] THEN 2 -- 可按顺序扩展更多CASE条件 END AS case_priority, CASE WHEN [你的Case1判定条件] THEN 'Case 1' WHEN [你的Case2判定条件] THEN 'Case 2' -- 对应返回值和上方条件一一匹配 END AS case_result, -- 按用户分组,组内按优先级升序排序,排名第1即为该用户首个匹配结果 ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY case_priority ASC) AS rn FROM [你的业务表名] ) SELECT user_id, case_result FROM user_case_rank WHERE rn = 1;
提示:如果需要同时获取匹配结果对应行的其他业务字段,直接在子查询的SELECT后添加对应字段即可。
低版本MySQL聚合实现(无需窗口函数支持)
SELECT user_id, COALESCE( MAX(CASE WHEN [你的Case1判定条件] THEN 'Case 1' END), MAX(CASE WHEN [你的Case2判定条件] THEN 'Case 2' END) -- 可按顺序扩展更多CASE条件 ) AS case_result FROM [你的业务表名] GROUP BY user_id;
提示:
COALESCE会按顺序返回第一个非空值,和CASE的首个匹配逻辑完全对齐,写法更简洁适合仅需返回用户ID和匹配结果的场景。
使用说明
将代码中[你的Case1判定条件]、[你的Case2判定条件]、[你的业务表名]替换为你实际的业务判断规则和表名即可运行。
内容的提问来源于stack exchange,提问作者Yemisi
相关产品推荐
相关产品推荐

