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

MySQL中按账户编号获取每个登记项的最新行数据的实现方法

解决分组取最新完整记录的问题

这个问题我太熟悉了——很多人刚用GROUP BY的时候都会踩这个坑!核心问题在于,GROUP BY只会聚合你指定的字段,其他非聚合字段的返回结果是不确定的,哪怕你用了MAX(ID)或者MAX(CONDATE),也没法保证其他字段来自同一行最新的记录。下面给你两种靠谱的解决办法,根据你的MySQL版本选就行:

方法1:用窗口函数ROW_NUMBER()(推荐,MySQL 8.0+)

这是现在最简洁也最不容易出错的方案,利用窗口函数给每个分组内的记录按时间排序,然后取排序后第一条(也就是最新的那条):

SELECT *
FROM (
    SELECT 
        *,
        ROW_NUMBER() OVER (
            PARTITION BY email, LDC_ACCT  -- 按你需要分组的字段来
            ORDER BY CONDATE DESC, ID DESC  -- 先按日期倒序,日期相同则按ID倒序确保唯一
        ) AS row_num
    FROM your_table_name  -- 替换成你的表名
) AS ranked
WHERE row_num = 1;
  • PARTITION BY后面放你要分组的字段(比如email、LDC_ACCT),把相同值的记录归为一组
  • ORDER BY指定排序规则,CONDATE DESC保证最新的日期排在前面,如果有多个记录日期相同,再加ID DESC用自增ID确保唯一的最新记录
  • 最后外层筛选row_num = 1,就拿到每个分组的最新完整记录

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

如果你的MySQL版本还不支持窗口函数,可以先找出每个分组的最新标识(比如最大的ID或者最新的CONDATE),再和原表关联获取完整记录:

SELECT t.*
FROM your_table_name t
INNER JOIN (
    SELECT 
        email, 
        LDC_ACCT, 
        MAX(CONDATE) AS latest_date,
        MAX(ID) AS latest_id  -- 可选,用来处理日期相同的情况
    FROM your_table_name
    GROUP BY email, LDC_ACCT
) AS latest ON 
    t.email = latest.email 
    AND t.LDC_ACCT = latest.LDC_ACCT 
    AND t.CONDATE = latest.latest_date
    AND t.ID = latest.latest_id;  -- 如果用ID的话加上这个条件
  • 子查询先按分组字段聚合,拿到每个组的最新日期(和最大ID)
  • 然后通过INNER JOIN把原表和子查询结果关联,确保拿到的是对应最新日期+ID的完整行
  • 注意:如果同一个分组里有多个记录的CONDATE完全相同,必须加ID的关联条件,否则会返回多条记录

额外提醒

  • 不管用哪种方法,都要确保你的分组字段(email、LDC_ACCT)是你真正要分组的维度,不要漏写
  • 如果判断“最新”的依据是ID(比如ID是自增主键,越大越新),那可以直接用MAX(ID)来替代MAX(CONDATE),逻辑会更简单

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:30:06