使用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
相关产品推荐
相关产品推荐

