SQL中处理除日期外重复记录,保留最新日期行的问题
解决方案:保留每组重复记录中fecDate最大的行
针对你的需求,这里提供三种常用的SQL实现方式,解决仅保留data1、data2、data3字段重复组中fecDate最大行的问题:
方法一:GROUP BY 分组聚合(最简方案)
直接按重复字段分组,聚合获取每组的最大日期,这是最适合你当前场景的方案:
SELECT data1, data2, data3, MAX(fecDate) AS fecDate FROM your_table_name GROUP BY data1, data2, data3;
你之前仅使用MAX(fecDate)但未添加GROUP BY子句,导致SQL将全表视为一个分组,因此只返回一条记录。添加分组字段后,会按每组单独计算最大日期。
方法二:窗口函数ROW_NUMBER()(灵活扩展方案)
如果后续表中新增其他需要保留的非重复字段,窗口函数可以精准定位到每组中日期最大的行:
WITH ranked_records AS ( SELECT data1, data2, data3, fecDate, -- 按重复字段分区,按日期降序排序,每组第一条即为最大日期行 ROW_NUMBER() OVER (PARTITION BY data1, data2, data3 ORDER BY fecDate DESC) AS rn FROM your_table_name ) SELECT data1, data2, data3, fecDate FROM ranked_records WHERE rn = 1;
该方法支持绝大多数现代SQL数据库(如MySQL 8.0+、PostgreSQL、SQL Server等)。
方法三:子查询关联(兼容老版本数据库)
如果你的数据库不支持窗口函数,可通过子查询获取每组最大日期,再与原表关联匹配目标行:
SELECT t1.data1, t1.data2, t1.data3, t1.fecDate FROM your_table_name t1 INNER JOIN ( -- 先获取每组的最大日期 SELECT data1, data2, data3, MAX(fecDate) AS max_date FROM your_table_name GROUP BY data1, data2, data3 ) t2 ON t1.data1 = t2.data1 AND t1.data2 = t2.data2 AND t1.data3 = t2.data3 AND t1.fecDate = t2.max_date;
内容的提问来源于stack exchange,提问作者mikestr
相关产品推荐
相关产品推荐

