如何基于Place和Grade非空条件过滤同名重复记录
二次过滤重复姓名记录的实现方案
示例原始数据
| 行号 | 姓名 | 地点 | 成绩 |
|---|---|---|---|
| Row 1 | Smith | (null) | (null) |
| Row 2 | Kat | Poland | 2 |
| Row 3 | Kat | (null) | (null) |
过滤规则
- 对同名的重复记录,优先保留地点(Place)和成绩(Grade)均非空的行
- 若某姓名的所有记录都不满足上述条件,则保留该姓名的任意一条记录
- 最终得到每个姓名仅一条记录的结果集
实现SQL(基于窗口函数)
假设原始查询结果存储在临时表/子查询temp_result中,可通过以下二次过滤语句得到目标结果:
SELECT Name, Place, Grade FROM ( SELECT Name, Place, Grade, -- 按姓名分组,优先排序出Place和Grade均非空的记录 ROW_NUMBER() OVER ( PARTITION BY Name ORDER BY CASE WHEN Place IS NOT NULL AND Grade IS NOT NULL THEN 0 ELSE 1 END ) AS row_rank FROM temp_result ) filtered WHERE row_rank = 1;
逻辑说明
- 使用
PARTITION BY Name将数据按姓名分组 - 通过
CASE表达式给符合条件的记录赋予更高排序优先级(0比1靠前) - 取每组的第一条记录(
row_rank = 1),即为每个姓名的目标记录
内容的提问来源于stack exchange,提问作者QuickSilver
相关产品推荐
相关产品推荐

