SQL查询需求:按role优先级获取唯一id对应的角色值
解决方案
要实现按g > s > f的优先级为每个唯一id选择对应的role,核心是给不同role定义优先级,再按id筛选出优先级最高的记录,以下是两种通用实现方式:
方法一:窗口函数(推荐,支持MySQL 8+、PostgreSQL、SQL Server等)
利用ROW_NUMBER()窗口函数按优先级给每个id下的role排序,取排序第一的记录:
SELECT id, role FROM ( SELECT id, role, ROW_NUMBER() OVER ( PARTITION BY id ORDER BY CASE role WHEN 'g' THEN 1 WHEN 's' THEN 2 WHEN 'f' THEN 3 END ASC ) AS rn FROM your_table ) t WHERE rn = 1;
逻辑说明:
PARTITION BY id:按id分组处理ORDER BY CASE...:给g分配最高优先级(排序值1),s次之(2),f最低(3)- 外层筛选
rn=1:取每个id组内优先级最高的role
方法二:GROUP BY + CASE判断(兼容老版本数据库)
通过聚合函数判断每个id是否存在高优先级role,再依次返回对应值:
SELECT id, CASE WHEN MAX(CASE WHEN role = 'g' THEN 1 ELSE 0 END) = 1 THEN 'g' WHEN MAX(CASE WHEN role = 's' THEN 1 ELSE 0 END) = 1 THEN 's' ELSE 'f' END AS role FROM your_table GROUP BY id;
逻辑说明:
- 先检查每个
id是否存在g(MAX(...) =1表示存在),存在则返回g - 若不存在
g,再检查是否存在s,存在则返回s - 最后默认返回
f
两种方法都能得到你期望的结果:
| id | role |
|---|---|
| b | g |
| a | s |
| c | f |
内容的提问来源于stack exchange,提问作者kiooikml
相关产品推荐
相关产品推荐

