筛选关联重复记录的最新日期:多控制记录数据处理需求
解决每个Installation保留最新控制记录的SQL方案
嘿,我来帮你搞定这个需求!要从关联的installation和controle表中,筛选出每个installation对应的最新控制日期的记录,这里有几种实用的SQL实现方式,适配不同的数据库环境:
方法1:使用窗口函数(推荐,适合现代数据库)
这种方法用ROW_NUMBER()窗口函数给每个id_install下的记录按日期倒序编号,然后取编号为1的那条,就是最新的记录。代码如下:
WITH ranked_controles AS ( SELECT i.id_install, c.id_control, c.des_date_control AS date_control, -- 按installation分组,日期倒序排名,最新的排第1 ROW_NUMBER() OVER (PARTITION BY i.id_install ORDER BY c.des_date_control DESC) AS rn FROM installation i JOIN controle c ON i.id_install = c.id_install ) SELECT id_install, id_control, date_control FROM ranked_controles WHERE rn = 1;
执行后,针对你的示例数据,会得到:
id_install | id_control | date_control -----------|------------|------------- 9001 | 194 | 1905-07-03
方法2:子查询关联(兼容老版本数据库)
如果你的数据库不支持窗口函数(比如MySQL 5.x),可以先通过子查询获取每个id_install的最大控制日期,再关联回原表拿到对应的完整记录:
SELECT i.id_install, c.id_control, c.des_date_control AS date_control FROM installation i JOIN controle c ON i.id_install = c.id_install JOIN ( -- 子查询获取每个installation的最新日期 SELECT id_install, MAX(des_date_control) AS max_date FROM controle GROUP BY id_install ) latest ON c.id_install = latest.id_install AND c.des_date_control = latest.max_date;
这种方法同样能得到你想要的结果,而且兼容性更广。
补充说明
- 如果存在同一个
installation在同一天有多个控制记录的情况,方法1会随机保留一条(可以调整ORDER BY加入id_control DESC来指定取最大id的记录);方法2会返回所有同一天的记录,你可以根据实际需求调整。 - 确保
controle表的des_date_control字段是日期类型,这样MAX()函数和排序才能正常工作。
内容的提问来源于stack exchange,提问作者Amandine
相关产品推荐
相关产品推荐

