求带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;
逻辑说明
- 子查询先按原条件过滤数据,再通过
COUNT(*) OVER (PARTITION BY A, B, C)统计每个A、B、C组合的出现次数; - 外层查询只保留出现次数为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
相关产品推荐
相关产品推荐

