按ID删除最早记录(含多条同日期最早记录)的技术实现问题
解决方案
方法1:子查询筛选
先找出每个ID对应的最早日期,再筛选掉所有日期等于该ID最早日期的记录。假设表名为your_table,SQL语句如下:
SELECT t.ID, t.DATE FROM your_table t JOIN ( SELECT ID, MIN(STR_TO_DATE(DATE, '%d/%m/%Y')) AS min_date FROM your_table GROUP BY ID ) sub ON t.ID = sub.ID WHERE STR_TO_DATE(t.DATE, '%d/%m/%Y') > sub.min_date;
不同数据库的日期转换函数略有差异:
- MySQL用
STR_TO_DATE(DATE, '%d/%m/%Y') - PostgreSQL用
TO_DATE(DATE, 'DD/MM/YYYY') - SQL Server用
CONVERT(DATE, DATE, 103)
方法2:窗口函数标记
用窗口函数直接计算每个ID分组内的最小日期,再过滤掉匹配最小日期的记录:
SELECT ID, DATE FROM ( SELECT ID, DATE, MIN(STR_TO_DATE(DATE, '%d/%m/%Y')) OVER (PARTITION BY ID) AS min_date FROM your_table ) t WHERE STR_TO_DATE(t.DATE, '%d/%m/%Y') > t.min_date;
说明
你之前用的排序去重只会删除单条最早记录,没法处理同一ID下多条同日期的最早记录。上面两种方法都是基于日期值筛选,只要是该ID的最早日期,不管有多少条都会被全部删除,完全匹配你的预期结果。
内容的提问来源于stack exchange,提问作者GuidoSerrano
相关产品推荐
相关产品推荐

