如何基于两列值筛选SQL数据:同名时保留FALSE记录
高效SQL处理重复NAME的OPT_IN记录清理
原始数据
| NAME | OPT_IN |
|---|---|
| JOHN | TRUE |
| JOHN | FALSE |
| KEK | TRUE |
需求
- 当同一
NAME同时存在OPT_IN为TRUE和FALSE的记录时,仅保留OPT_IN为FALSE的记录 - 对于仅存在
OPT_IN为TRUE的NAME,保留该记录
期望结果
| NAME | OPT_IN |
|---|---|
| JOHN | FALSE |
| KEK | TRUE |
解决方案
方法1:使用窗口函数(推荐,适配多数现代SQL数据库)
利用ROW_NUMBER()窗口函数按NAME分组,给OPT_IN=FALSE的记录分配最高优先级,再筛选每组的第一条记录:
WITH ranked_records AS ( SELECT NAME, OPT_IN, ROW_NUMBER() OVER ( PARTITION BY NAME ORDER BY CASE WHEN OPT_IN = FALSE THEN 1 ELSE 2 END ) AS rn FROM your_table_name ) SELECT NAME, OPT_IN FROM ranked_records WHERE rn = 1;
逻辑说明:
PARTITION BY NAME按姓名分组处理ORDER BY CASE让FALSE记录排在每组最前列,ROW_NUMBER()会为其分配序号1- 最终只保留每组序号为
1的记录,完全匹配需求
方法2:使用EXISTS子查询
通过判断当前记录的NAME是否存在OPT_IN=FALSE的记录,决定是否保留:
SELECT t1.NAME, t1.OPT_IN FROM your_table_name t1 WHERE t1.OPT_IN = FALSE OR NOT EXISTS ( SELECT 1 FROM your_table_name t2 WHERE t2.NAME = t1.NAME AND t2.OPT_IN = FALSE );
逻辑说明:
- 直接保留所有
OPT_IN=FALSE的记录 - 仅当某个
NAME不存在任何OPT_IN=FALSE记录时,才保留其OPT_IN=TRUE的记录
两种方法均在数据库层面完成数据清理,避免了导出数据到Python后处理的额外开销,效率远高于原方案。
内容的提问来源于stack exchange,提问作者kemoosabee
相关产品推荐
相关产品推荐

