关联两表并基于Date字段去重:获取Table-2唯一记录
解决方案:关联表后获取每个AccountKey的最新记录
下面是几种可行的SQL实现方案,适配不同数据库场景:
方法1:窗口函数(推荐,支持MySQL 8+、PostgreSQL、SQL Server等)
利用ROW_NUMBER()窗口函数给每个AccountKey分组内的记录按日期倒序编号,取编号为1的就是最新记录:
SELECT t1.Id, t1.AccountKey, t2.Date FROM Table1 t1 JOIN ( SELECT `Account Key`, Date, ROW_NUMBER() OVER (PARTITION BY `Account Key` ORDER BY Date DESC) AS rn FROM Table2 ) t2 ON t1.AccountKey = t2.`Account Key` WHERE t2.rn = 1;
原理:子查询中按Account Key分组,对每组内的记录按Date降序排序,最新的记录会被标记为rn=1,再和Table1关联筛选出该记录即可。
方法2:子查询筛选最大日期后关联
先统计每个Account Key对应的最大日期,再通过关联获取对应记录,兼容性更好(适配旧版本数据库):
SELECT t1.Id, t1.AccountKey, t2.Date FROM Table1 t1 JOIN Table2 t2 ON t1.AccountKey = t2.`Account Key` JOIN ( SELECT `Account Key`, MAX(Date) AS MaxDate FROM Table2 GROUP BY `Account Key` ) t3 ON t2.`Account Key` = t3.`Account Key` AND t2.Date = t3.MaxDate;
原理:子查询t3先算出每个Account Key的最新日期,再通过两次关联确保只取Table2中对应该日期的记录,最后和Table1关联得到结果。
方法3:关联子查询(适合单条最新记录场景)
因为题目说明Table2的Date字段具有唯一性,每个AccountKey的最新日期对应唯一记录,也可以用关联子查询直接筛选:
SELECT t1.Id, t1.AccountKey, t2.Date FROM Table1 t1 JOIN Table2 t2 ON t1.AccountKey = t2.`Account Key` WHERE t2.Date = ( SELECT MAX(Date) FROM Table2 WHERE `Account Key` = t1.AccountKey );
原理:对Table1中的每个AccountKey,通过子查询找到Table2中对应的最大日期,直接筛选出Table2中匹配该日期的记录。
内容的提问来源于stack exchange,提问作者Tech Travellers
相关产品推荐
相关产品推荐

