You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL中参数列值相同时查询最新编辑时间的记录

按双参数分组取最新编辑记录的SQL写法

场景说明

待查询表包含4个字段:

  • Filename:存储文件名
  • Edited:存储文件最后编辑时间
  • PARAMETER1:业务参数1
  • PARAMETER2:业务参数2

表内样例数据:

  1. file1.csv:编辑时间2022-06-08 17:23:16,PARAMETER1值为RED,PARAMETER2值为BLUE
  2. file2.csv:编辑时间2022-06-09 15:54:45,PARAMETER1值为GREEN,PARAMETER2值为YELLOW
  3. file3.csv:编辑时间2022-06-15 14:52:40,PARAMETER1值为RED,PARAMETER2值为BLUE

需求为按PARAMETER1和PARAMETER2的取值组合分组,仅返回每组中编辑时间最新的完整行记录,预期返回file2.csv、file3.csv两条结果。
直接使用GROUP BY语法时,受SQL模式限制,很容易出现非分组字段取值和最大时间不匹配的问题,之前尝试写的关联子查询也存在笔误导致结果不准。

原有SQL的错误点

之前写的SQL子查询中,最后一个关联条件写为u2.PARAMETER2 = u2.PARAMETER2,这个条件恒为真,相当于没有对PARAMETER2做分组匹配,会导致返回结果不符合预期。

可直接使用的实现方案

方案1:修正后的关联子查询(全SQL版本兼容)

逻辑简单,不需要依赖数据库新特性,修正关联条件即可使用:

SELECT u1.* 
FROM 你的表名 u1 
WHERE u1.Edited = (
    SELECT MAX(u2.Edited) 
    FROM 你的表名 u2 
    WHERE u2.PARAMETER1 = u1.PARAMETER1 
      AND u2.PARAMETER2 = u1.PARAMETER2
);

注意:如果同一参数组下存在多条编辑时间完全相同的记录,该写法会将这些记录全部返回。

方案2:窗口函数实现(支持MySQL8.0+、PostgreSQL、SQL Server等主流数据库新版本)

查询性能更优,逻辑更直观,通过窗口函数按参数组分片、按编辑时间倒序排序后取每组第一条:

SELECT Filename, Edited, PARAMETER1, PARAMETER2
FROM (
    SELECT *,
           ROW_NUMBER() OVER (
               PARTITION BY PARAMETER1, PARAMETER2 
               ORDER BY Edited DESC
           ) AS row_rank
    FROM 你的表名
) t
WHERE row_rank = 1;

注意:如果需要保留同组内编辑时间并列最新的所有记录,将ROW_NUMBER()替换为RANK()即可。


内容的提问来源于stack exchange,提问作者Darkmoon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 14:42:17