MySQL如何在ORDER BY排序后提取每个machine_id分组的首行最新记录
获取每个设备最新日期对应记录的SQL实现
方案1:窗口函数法(主流现代数据库通用,推荐)
适用于MySQL 8.0+、PostgreSQL、SQL Server、Oracle等支持窗口函数的数据库:
WITH ranked_records AS ( SELECT *, -- 按设备ID分组,组内按日期倒序排序,给每行编号 ROW_NUMBER() OVER (PARTITION BY machine_id ORDER BY date DESC) AS row_num FROM `table` ) SELECT date, machine_id, colA, colB, colC FROM ranked_records WHERE row_num = 1;
- 注意:如果同一设备同一最新日期存在多条记录,只需要返回其中一条时用
ROW_NUMBER(),需要返回所有符合条件的记录时替换为RANK()即可。
方案2:关联子查询法(兼容低版本数据库)
适用于不支持窗口函数的场景(如MySQL 5.x版本):
SELECT t1.* FROM `table` t1 INNER JOIN ( -- 先查询每个设备对应的最新日期 SELECT machine_id, MAX(date) AS latest_date FROM `table` GROUP BY machine_id ) t2 ON t1.machine_id = t2.machine_id AND t1.date = t2.latest_date;
- 注意:该方案默认返回同一设备同一最新日期下的所有匹配记录。
内容的提问来源于stack exchange,提问作者Miquel
相关产品推荐
相关产品推荐

