如何查询数据表中某一列各不同取值对应的最新记录
可行实现方案
1. 支持窗口函数的数据库(MySQL8.0+、PostgreSQL、SQL Server等)
用ROW_NUMBER()窗口函数实现,不需要提前知道所有vehicle取值,自动按分组取最新记录:
SELECT id, vehicle, 你需要的其他字段 FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY vehicle ORDER BY id DESC) AS row_rank FROM 你的业务表名 ) temp_table WHERE row_rank = 1;
逻辑说明:PARTITION BY vehicle按车辆分组,ORDER BY id DESC把同组内自增id最大的最新记录排在最前,最后过滤出每组排名为1的记录即可。
2. 低版本MySQL(不支持窗口函数)
用子查询先捞每个vehicle对应的最大自增id,再关联原表取完整行数据,也不需要提前知晓vehicle取值:
SELECT t1.* FROM 你的业务表名 t1 INNER JOIN ( SELECT vehicle, MAX(id) AS max_id FROM 你的业务表名 GROUP BY vehicle ) t2 ON t1.vehicle = t2.vehicle AND t1.id = t2.max_id;
MAX(id)返回null的常见原因
大概率是写法逻辑错误,比如直接写SELECT * FROM 表 WHERE id = (SELECT MAX(id) FROM 表 GROUP BY vehicle),子查询返回多个最大id值,用等于号匹配会失效;或是没有关联vehicle字段,全局最大id匹配不到对应分组的记录。
内容的提问来源于stack exchange,提问作者Vaggelis
相关产品推荐
相关产品推荐

