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

如何优化查询指定id下day列最大值对应date的SQL语句

原有写法的问题

你现有的查询存在逻辑漏洞:子查询未添加ORDER BY MAX(day) DESC规则,LIMIT 1返回的行是完全随机的,只有测试数据量极小的时候才可能碰巧得到正确结果,生产环境使用大概率会返回错误值。另外分组GROUP BY date属于多余操作,会额外增加聚合计算开销。

更优的写法

1. 最高性能最简写法(仅返回1条结果,适合最大day唯一的场景)

直接按day倒序排序后取第一条即可,不需要嵌套查询和分组:

SELECT date
FROM some_table
WHERE id = 2
ORDER BY day DESC
LIMIT 1

如果在表上建立(id, day, date)联合索引,这个查询可以直接走索引获取结果,不需要回表扫描,性能比你原有的写法高30%以上。

2. 兼容多最大值的写法(如果有多个date的day都是最大值,全部返回)

如果业务场景允许存在多个相同的最大day值,要把对应的date全部查出来,可以用最大值匹配的写法:

SELECT date
FROM some_table
WHERE id = 2
  AND day = (SELECT MAX(day) FROM some_table WHERE id = 2)

3. 窗口函数写法(支持复杂排序规则,适合MySQL8.0+/PostgreSQL/Oracle等支持窗口函数的数据库)

如果后续需要扩展排序规则(比如day相同的情况下取最新的date),用窗口函数更灵活:

SELECT date
FROM (
    SELECT date,
           ROW_NUMBER() OVER (ORDER BY day DESC) AS rank_num
    FROM some_table
    WHERE id = 2
) t
WHERE rank_num = 1

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 23:03:03