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

MySQL中不使用GROUP BY获取多列唯一最新记录

解决思路与实现方法

这问题我日常写SQL时经常碰到,GROUP BY因为MySQL的宽松模式容易出不符合预期的结果,DISTINCT又会对所有列去重,完全不是咱们要的效果。别慌,给你两种靠谱的解法,适配不同版本的MySQL:

方法一:窗口函数(MySQL 8.0+ 推荐使用)

这是最直观也最优雅的解法,利用ROW_NUMBER()窗口函数给每个dailytrades_symbol分组内的记录按日期排序,然后筛选出每组的第一条(也就是最新的那条记录)。

SELECT *
FROM (
    SELECT 
        *,
        ROW_NUMBER() OVER (
            PARTITION BY dailytrades_symbol 
            ORDER BY dailytrades_date DESC
        ) AS rn
    FROM dailytrades
) t
WHERE rn = 1;

逻辑说明:

  • PARTITION BY dailytrades_symbol:把数据按股票代码分组,每个组单独处理
  • ORDER BY dailytrades_date DESC:在每个组内按日期降序排序,最新的日期排在最前面
  • ROW_NUMBER()会给每组内的记录从1开始编号,rn=1就代表每个组里最新的那条记录

如果你的需求是:同一股票代码在同一天有多条记录时,还要取某条特定的(比如交易量最大的),只需要在ORDER BY里加额外条件就行,比如:

ORDER BY dailytrades_date DESC, dailytrades_qty DESC

方法二:子查询关联(兼容MySQL 5.x版本)

如果你的MySQL版本还没升级到8.0,用子查询先找到每个股票代码对应的最新日期,再和原表关联获取完整记录。

SELECT d.*
FROM dailytrades d
INNER JOIN (
    SELECT 
        dailytrades_symbol,
        MAX(dailytrades_date) AS latest_date
    FROM dailytrades
    GROUP BY dailytrades_symbol
) t ON d.dailytrades_symbol = t.dailytrades_symbol 
   AND d.dailytrades_date = t.latest_date;

注意点:

这种方法如果同一股票代码在最新日期有多条记录(比如你数据里的CWKN在2020-01-13有两条),会返回所有符合日期的记录。如果只想保留其中一条,可以再加一层筛选,比如按交易量取最大的:

SELECT d.*
FROM dailytrades d
INNER JOIN (
    SELECT 
        dailytrades_symbol,
        MAX(dailytrades_date) AS latest_date,
        MAX(dailytrades_qty) AS max_qty
    FROM dailytrades
    GROUP BY dailytrades_symbol
) t ON d.dailytrades_symbol = t.dailytrades_symbol 
   AND d.dailytrades_date = t.latest_date
   AND d.dailytrades_qty = t.max_qty;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 18:57:31