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

如何在MySQL中选取time1列值相同且最新的所有行

嘿,这个需求我碰到过好多次了,给你分享几种在MySQL里实现的方法,你可以根据自己的MySQL版本和数据规模来选:

方法1:窗口函数(MySQL 8.0+首选)

如果你用的是MySQL 8.0及以上版本,强烈推荐用窗口函数,代码简洁还好理解,效率也高。核心思路是给每个time1分组里的行按时间排序,然后挑出排名第一的行。

示例代码:

SELECT *
FROM (
    SELECT 
        *,
        -- 按time1分组,每组内按时间倒序编号,最新的行编号为1
        ROW_NUMBER() OVER (PARTITION BY time1 ORDER BY your_time_column DESC) AS row_rank
    FROM your_table_name
) ranked_data
WHERE row_rank = 1;

补充说明:

  • 把your_table_name换成你的实际表名,your_time_column换成记录时间的列(比如update_time或者create_time)
  • 如果同一个time1下有多个行是同一最新时间,想把这些行都保留的话,把ROW_NUMBER()换成RANK()或者DENSE_RANK()就行——这俩函数会给相同时间的行分配相同的排名,不会只留一行
方法2:子查询关联(兼容所有MySQL版本)

要是你的MySQL版本低于8.0,没法用窗口函数,那就用子查询先找出每个time1对应的最新时间,再关联原表拿完整数据。

示例代码:

SELECT main_table.*
FROM your_table_name main_table
INNER JOIN (
    -- 先找出每个time1对应的最新时间
    SELECT time1, MAX(your_time_column) AS latest_time
    FROM your_table_name
    GROUP BY time1
) latest_time_map 
ON main_table.time1 = latest_time_map.time1 
AND main_table.your_time_column = latest_time_map.latest_time;

这个方法的逻辑很直观:先通过分组聚合拿到每个time1的最新时间,再用这个结果去匹配原表中对应的数据行,就能得到每个time1组里的最新记录。

方法3:EXISTS子句(小数据量场景适用)

还有一种写法是用EXISTS来判断当前行是不是该time1组里的最新行,适合数据量不大的情况:

SELECT *
FROM your_table_name t1
WHERE NOT EXISTS (
    -- 检查是否存在同一time1且时间更晚的行
    SELECT 1
    FROM your_table_name t2
    WHERE t2.time1 = t1.time1 AND t2.your_time_column > t1.your_time_column
);

简单说就是:如果某一行在它的time1分组里找不到比它时间更新的行,那它就是我们要找的最新行。

记得把代码里的占位符换成你实际的表名和列名哦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:46:54