SQL如何按Phase分组后查询每个分组的最后一行记录
SQL查询获取每个Phase分组最后一行记录的实现方案
下面提供两种适配不同数据库版本的实现方式:
方式1:支持窗口函数的数据库(MySQL 8.0+、PostgreSQL、Oracle、SQL Server等通用方案)
使用ROW_NUMBER()窗口函数实现,逻辑直观性能较好:
SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY Phase ORDER BY `timestamp` DESC) AS row_rank FROM 你的表名 -- 替换为实际表名 ) temp_table WHERE row_rank = 1;
- 逻辑说明:
PARTITION BY Phase按Phase字段分组,ORDER BY timestamp DESC将每个分组内的记录按时间戳倒序排列,最新的记录排序为1,外层过滤即可拿到每个分组的最后一行。 - 调整提示:如果同一Phase下存在多条相同最大时间戳的记录且需要全部返回,将
ROW_NUMBER()替换为RANK()即可。
方式2:不支持窗口函数的低版本数据库(如MySQL 5.x)
可以用子查询加关联的方式实现:
SELECT t1.* FROM 你的表名 t1 -- 替换为实际表名 INNER JOIN ( SELECT Phase, MAX(`timestamp`) AS max_timestamp FROM 你的表名 -- 替换为实际表名 GROUP BY Phase ) t2 ON t1.Phase = t2.Phase AND t1.`timestamp` = t2.max_timestamp;
- 逻辑说明:先通过子查询统计每个Phase对应的最大时间戳,再和原表关联匹配,得到对应时间戳的完整行记录。
- 注意:该方式默认会返回同一Phase相同最大时间戳下的所有匹配记录。
内容的提问来源于stack exchange,提问作者Azim Kamal
相关产品推荐
相关产品推荐

