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

使用MAX聚合函数关联去重:提取客户最新数据的SQL问题

解决每个客户最新数据去重的问题

我来帮你搞定这个问题~你现在遇到的情况是,当同一个客户在最新的访问日期下有多条记录时,当前的关联查询会把这些记录都返回,导致出现重复行。要实现每个客户只返回一条最新日期的记录(test3或test4任选其一都可以),这里有几个实用的解决方案:

方案一:用ROW_NUMBER()窗口函数(推荐)

这是最灵活的方法,能让你精准控制选哪一条记录,也适用于更复杂的场景。我们可以给每个客户的记录按「访问日期降序」+「可选的lData排序」编上号,然后只取编号为1的行:

SELECT lClientID, lData, datAccess
FROM (
    SELECT 
        *,
        ROW_NUMBER() OVER (
            PARTITION BY lClientID 
            ORDER BY datAccess DESC, lData DESC -- 这里lData DESC会取test4,换成ASC就取test3
        ) AS row_num
    FROM tblAccess
) AS ranked_records
WHERE row_num = 1;

如果你完全不在乎取哪条,只需要每个客户一条最新记录,也可以把ORDER BY简化成ORDER BY datAccess DESC,数据库会随机返回其中一条,但加上lData排序能让结果更可控。

方案二:在聚合子查询中同时处理lData

如果你的数据库支持,也可以在获取最大访问日期的同时,用MAX()或MIN()来锁定对应的lData,直接关联查询:

SELECT 
    t1.lClientID,
    t1.lData,
    t1.datAccess,
    t2.datLastDate
FROM tblAccess AS t1
INNER JOIN (
    SELECT 
        lClientID, 
        MAX(datAccess) AS datLastDate,
        MAX(lData) AS target_data -- 用MAX取test4,用MIN就取test3
    FROM tblAccess 
    GROUP BY lClientID
) AS t2 
    ON t1.lClientID = t2.lClientID 
    AND t1.datAccess = t2.datLastDate
    AND t1.lData = t2.target_data;

这个方法比较简洁,但只适用于lData在同日期下唯一的情况,刚好你的场景符合。

最终结果验证

用方案一的查询,你会得到符合预期的结果:

+-----------+-------+------------+
| lClientID | lData | datAccess  |
+-----------+-------+------------+
| 1         | test2 | 08.06.2019 |
| 2         | test4 | 15.06.2019 |
+-----------+-------+------------+

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:19:45