You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何查询MySQL表中指定年份的最新datetime行

嘿,这个问题我之前在项目里碰到过,给你分享几个实用的解决方案,适配不同的场景:

方法1:子查询匹配最大时间

这是最直接的写法,先算出指定年份的最大datetime值,再用这个值关联原表拿到对应的行:

-- 替换your_table为你的表名,event_time为datetime列名,2015为目标年份
SELECT *
FROM your_table
WHERE event_time = (
    SELECT MAX(event_time)
    FROM your_table
    WHERE YEAR(event_time) = 2015
);

说明:如果有多行记录刚好是同一个最大时间,这个语句会返回所有符合条件的行,适合需要保留重复最新记录的场景。

方法2:窗口函数排名取第一

如果需要更灵活的逻辑(比如一次性获取多个年份的最新行),用ROW_NUMBER()窗口函数会更方便:

SELECT *
FROM (
    SELECT 
        *,
        -- 按年份分组,每组内按时间降序排名
        ROW_NUMBER() OVER (PARTITION BY YEAR(event_time) ORDER BY event_time DESC) AS rn
    FROM your_table
    -- 只筛选2015年的数据,如需多年份可去掉此条件
    WHERE YEAR(event_time) = 2015
) AS ranked_data
-- 取每组排名第一的行(即该年份最新的记录)
WHERE rn = 1;

说明:如果去掉外层的WHERE YEAR(event_time)=2015,就能一次性得到每个年份的最新行,扩展性很强。

性能优化提示

如果你的表数据量很大,直接用YEAR(event_time)会导致索引失效(因为函数会破坏索引的有序性),建议改用范围查询来利用event_time上的索引:

-- 优化后的子查询版本
SELECT *
FROM your_table
WHERE event_time = (
    SELECT MAX(event_time)
    FROM your_table
    WHERE event_time >= '2015-01-01 00:00:00' 
      AND event_time < '2016-01-01 00:00:00'
);

这个写法能让数据库直接走索引查找2015年的所有数据,计算最大时间的速度会快很多。

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

火山引擎 最新活动