如何在MariaDB中筛选车辆部件更换的最新记录?
提取车辆部件最新更换记录的解决方案
问题背景
我有一个记录车辆部件更换历史的数据库,同一车辆的同一部件可能多次更换,需要提取每个车辆对应部件的最新更换记录及相关数据。
样本数据表
| Part | Install_Date | NewSerial Number | Vehicle |
|---|---|---|---|
| A | 2023-2-17 | 123456 | Bus1 |
| A | 2022-12-3 | 789101 | Bus1 |
| A | 2021-11-4 | X2349 | Bus1 |
| A | 2022-10-6 | XTY76 | Bus2 |
| A | 2020-9-6 | X56678 | Bus2 |
| B | 2022-6-7 | 123456 | Bus1 |
| B | 2020-5-31 | 56gh6 | Bus1 |
期望输出
| Part | Install_Date | NewSerial Number | Vehicle |
|---|---|---|---|
| A | 2023-2-17 | 123456 | Bus1 |
| A | 2022-10-6 | XTY76 | Bus2 |
| B | 2022-6-7 | 123456 | Bus1 |
可行解决方案(MariaDB环境)
方案1:窗口函数ROW_NUMBER()(推荐,MariaDB 10.2+支持)
这是最高效简洁的实现方式:
SELECT Part, Install_Date, `NewSerial Number`, Vehicle FROM ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY Vehicle, Part ORDER BY STR_TO_DATE(Install_Date, '%Y-%m-%d') DESC ) AS rn FROM your_table_name ) t WHERE rn = 1;
- 逻辑:
PARTITION BY Vehicle, Part按车辆+部件分组,ORDER BY Install_Date DESC按安装日期倒序排序,ROW_NUMBER()给每组内的记录编号,取编号为1的就是最新记录。 - 注意:如果
Install_Date字段本身是DATE/DATETIME类型,可直接用Install_Date排序,无需STR_TO_DATE转换。
方案2:JOIN+子查询(兼容低版本MariaDB)
若你的MariaDB版本低于10.2,不支持窗口函数,可使用此方案:
SELECT t1.* FROM your_table_name t1 JOIN ( SELECT Vehicle, Part, MAX(STR_TO_DATE(Install_Date, '%Y-%m-%d')) AS latest_date FROM your_table_name GROUP BY Vehicle, Part ) t2 ON t1.Vehicle = t2.Vehicle AND t1.Part = t2.Part AND STR_TO_DATE(t1.Install_Date, '%Y-%m-%d') = t2.latest_date;
- 逻辑:先通过子查询获取每个车辆-部件组合的最新安装日期,再关联原表匹配对应记录。若存在同一天更换同一部件多次的情况,会返回多条记录,需根据实际需求添加主键过滤或
LIMIT限制。
注意事项
- 替换
your_table_name为你的实际数据表名。 - 确保
Install_Date的格式统一,避免日期转换错误。
内容的提问来源于stack exchange,提问作者Dave V
相关产品推荐
相关产品推荐

