SQL去重需求:排除与Seller类同金额的Own类记录
解决方案:保留Seller类并排除重复的Own类记录
核心思路
放弃分组取第一条的逻辑,换个更直接的方式:
- 先把Own类的日期统一转成当月首日,和Seller类的日期格式对齐
- 提取所有Seller类记录里「产品+账户+当月首日+金额」的唯一组合
- 最终结果 = 全部Seller类记录 + 不在上述组合里的Own类记录
具体SQL实现
WITH seller_records AS ( -- 提取Seller类的关键信息,日期已是当月首日,直接使用 SELECT product_id, account_id, date AS month_first_day, amount, 'Seller' AS type FROM inttbl ), own_processed AS ( -- 处理Own类日期,转换为当月首日(不同数据库函数不同,按需替换) SELECT product_id, account_id, -- MySQL写法:DATE_FORMAT(date, '%Y-%m-01') -- PostgreSQL写法:DATE_TRUNC('month', date)::DATE -- SQL Server写法:DATEFROMPARTS(YEAR(date), MONTH(date), 1) DATE_FORMAT(date, '%Y-%m-01') AS month_first_day, amount, 'Own' AS type FROM exttbl ) -- 合并数据:保留所有Seller,仅保留未与Seller重复的Own SELECT * FROM seller_records UNION ALL SELECT op.* FROM own_processed op LEFT JOIN seller_records sr ON op.product_id = sr.product_id AND op.account_id = sr.account_id AND op.month_first_day = sr.month_first_day AND op.amount = sr.amount WHERE sr.product_id IS NULL;
补充说明
- 日期转换函数需根据你使用的数据库调整,代码里标注了主流数据库的对应写法
- 这个逻辑精准过滤掉「同产品、同账户、当月、同金额」的重复Own记录,同时完整保留所有Seller类数据
- 相比ROW_NUMBER的分组逻辑,不会出现误删需要保留的记录的情况
内容的提问来源于stack exchange,提问作者Let Soo Gas
相关产品推荐
相关产品推荐

