SQL Server中按id与reign分组获取唯一size的查询方案
解决方案
需求明确:为每个id和reign的组合,保留优先级最高的size值,优先级顺序为 large > medium > small,且不修改原表。
原表数据
| id | size | reign |
|---|---|---|
| 1 | large | Riyadh |
| 1 | small | Riyadh |
| 2 | large | Makkah |
| 2 | medium | Makkah |
| 2 | small | Jeddah |
| 3 | medium | Dammam |
期望结果
| id | size | reign |
|---|---|---|
| 1 | large | Riyadh |
| 2 | large | Makkah |
| 2 | small | Jeddah |
| 3 | medium | Dammam |
SQL 查询语句
SELECT id, size, reign FROM ( SELECT id, size, reign, -- 按优先级给每个(id, reign)组内的size排序 ROW_NUMBER() OVER ( PARTITION BY id, reign ORDER BY CASE size WHEN 'large' THEN 1 WHEN 'medium' THEN 2 WHEN 'small' THEN 3 END ASC ) AS rn FROM your_table_name -- 替换为你的实际表名 ) AS ranked WHERE rn = 1;
逻辑说明
- PARTITION BY id, reign:将数据按
id和reign分组,确保每个组合单独处理。 - ORDER BY CASE...:自定义排序规则,让
large排第1,medium第2,small第3,这样每个组里优先级最高的size会被标记为rn=1。 - 外层筛选rn=1:只保留每个组里排名第一的记录,也就是优先级最高的
size。
若需调整优先级顺序,修改CASE语句中的排序值即可。
内容的提问来源于stack exchange,提问作者Abdulrahman Alotaibi
相关产品推荐
相关产品推荐

