You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于两列值筛选SQL数据:同名时保留FALSE记录

高效SQL处理重复NAME的OPT_IN记录清理

原始数据

NAMEOPT_IN
JOHNTRUE
JOHNFALSE
KEKTRUE

需求

  • 当同一NAME同时存在OPT_IN为TRUE和FALSE的记录时,仅保留OPT_IN为FALSE的记录
  • 对于仅存在OPT_IN为TRUE的NAME,保留该记录

期望结果

NAMEOPT_IN
JOHNFALSE
KEKTRUE

解决方案

方法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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 11:32:40