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

求带WHERE子句的多列完全去重SQL实现(对应Pandas指定参数)

实现与Pandas drop_duplicates(keep=False) 等价的SQL去重逻辑

要完全移除A、B、C列完全重复的行(无任何保留),同时保留原查询的过滤条件(day = 20230815 且 A < 4),可以用以下两种通用方法实现:

方法一:窗口函数法(推荐)

这种方法适用于支持窗口函数的数据库(如MySQL 8+、PostgreSQL、SQL Server、Oracle等),逻辑清晰且无需依赖主键:

SELECT day, A, B, C
FROM (
    SELECT 
        day, A, B, C,
        -- 统计每个A/B/C组合的总行数
        COUNT(*) OVER (PARTITION BY A, B, C) AS duplicate_count
    FROM MyTable
    -- 先应用原查询的过滤条件
    WHERE day = 20230815 AND A < 4
) AS filtered_data
-- 只保留没有重复的组合(即该组合仅出现一次)
WHERE duplicate_count = 1;

逻辑说明

  1. 子查询先按原条件过滤数据,再通过COUNT(*) OVER (PARTITION BY A, B, C)统计每个A、B、C组合的出现次数;
  2. 外层查询只保留出现次数为1的记录,直接排除所有存在重复的A/B/C组合。

方法二:自连接+EXISTS法

如果你的数据库不支持窗口函数,可以用自连接的方式实现,需要表有唯一标识列(如主键、自增ID等):

SELECT t1.day, t1.A, t1.B, t1.C
FROM MyTable t1
WHERE t1.day = 20230815 AND t1.A < 4
AND NOT EXISTS (
    SELECT 1
    FROM MyTable t2
    WHERE t2.A = t1.A 
      AND t2.B = t1.B 
      AND t2.C = t1.C
      AND t2.day = 20230815 AND t2.A < 4
      AND t2.id != t1.id -- 替换为你的表的唯一标识列,比如Oracle用ROWID
);

逻辑说明

通过NOT EXISTS判断:如果当前行存在其他行和它的A/B/C完全相同、且满足过滤条件、且不是自身,则说明当前行属于重复组,将其排除。

内容的提问来源于stack exchange,提问作者Maria C

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 16:02:45