SQL查询指定Plate列表中每个Plate对应最新1条记录的实现方法
解决方案
完全可以通过单条SQL实现需求,推荐使用窗口函数ROW_NUMBER()实现,适配SQL Server、PostgreSQL、MySQL 8.0+、Oracle等绝大多数主流数据库,示例语句如下:
SELECT ID, Plate, RecordedAt FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY Plate ORDER BY RecordedAt DESC) AS rn FROM 你的表名 WHERE Plate IN ('plate1', 'plate2', 'plate3') ) t WHERE rn = 1;
语句逻辑说明
- 内层查询用
PARTITION BY Plate将数据按Plate字段分组,每组内部按RecordedAt倒序排列,给组内每条记录生成序号rn,每组中最新的记录序号为1 - 外层查询仅保留序号为1的记录,即可拿到每个Plate对应的最新一条记录
如果使用不支持窗口函数的旧版本数据库(例如MySQL 5.x),可以用分组关联的方式实现:
SELECT t1.* FROM 你的表名 t1 INNER JOIN ( SELECT Plate, MAX(RecordedAt) AS max_time FROM 你的表名 WHERE Plate IN ('plate1', 'plate2', 'plate3') GROUP BY Plate ) t2 ON t1.Plate = t2.Plate AND t1.RecordedAt = t2.max_time WHERE t1.Plate IN ('plate1', 'plate2', 'plate3');
注意事项
如果某个Plate存在多条RecordedAt完全相同的记录,上述第二种写法会返回该Plate所有时间一致的最新记录,若需要仅返回1条可额外增加去重逻辑。
内容的提问来源于stack exchange,提问作者pedrodotnet
相关产品推荐
相关产品推荐

