如何筛选routeLogTbl中合并日期时间后最新的记录ID?
解决方法:筛选合并日期时间后的最新记录ID
没问题,我来帮你搞定这个需求!核心思路是先把arrival_date和arrival_time合并成完整的datetime类型字段,再找到这个字段值最大的记录对应的ID。下面分两种常用的SQL写法来讲解,适配不同场景:
方法一:子查询匹配最大时间
这种写法直接通过子查询找到全局最大的合并时间,再关联原表获取对应的ID:
-- MySQL 写法 SELECT id FROM routeLogTbl WHERE STR_TO_DATE(CONCAT(arrival_date, ' ', arrival_time), '%Y-%m-%d %H:%i:%s') = ( SELECT MAX(STR_TO_DATE(CONCAT(arrival_date, ' ', arrival_time), '%Y-%m-%d %H:%i:%s')) FROM routeLogTbl )
如果是其他数据库,合并字段的语法会略有不同:
- SQL Server:用
CAST(arrival_date AS DATETIME) + CAST(arrival_time AS DATETIME)替代STR_TO_DATE(...) - Oracle:用
TO_DATE(arrival_date || ' ' || arrival_time, 'YYYY-MM-DD HH24:MI:SS')
方法二:窗口函数(更推荐)
如果存在多条记录同时是"最新"(即合并后的时间完全相同),窗口函数可以灵活处理这种情况:
SELECT id FROM ( SELECT id, -- 按合并时间倒序排名,最新的排第1 ROW_NUMBER() OVER (ORDER BY STR_TO_DATE(CONCAT(arrival_date, ' ', arrival_time), '%Y-%m-%d %H:%i:%s') DESC) AS rn FROM routeLogTbl ) t WHERE rn = 1
- 如果允许返回所有最新的记录,把
ROW_NUMBER()换成RANK()即可。
针对你的示例数据,合并后的最大时间是2018-04-05 07:00:00,对应的ID是4,用上面两种写法都能得到正确结果。
内容的提问来源于stack exchange,提问作者user3450785
相关产品推荐
相关产品推荐

