如何从含两列唯一值的关联表中获取最新日期?已尝试排名与rownum=1未解决
如何从关联表中按唯一组合获取最新日期的记录?
我最近碰到个棘手的问题:要从一张以Name和ID作为唯一值组合的关联表里,取出每个组合对应的最新日期记录。试了排名函数却发现John出现了相同排名,用rownum = 1的方法也没得到想要的结果,当前查到的结果是这样的:
| Name | ID | DeptNo | DeptScore | OnDate | |
|---|---|---|---|---|---|
| John | A46 | john@doe.com | 100 | 50 | 5/11/2011 |
| John | A46 | johndoe@aol.com | 200 | 75 | 7/21/2015 |
| Alice | B33 | alice@hotmail.com | 100 | 50 | 4/15/2014 |
我想要的结果是每个唯一的Name+ID组合只保留最新OnDate的那条,比如John只留2015年的那条记录。
几种可行的解决方案
思路核心
要么先找出每个Name+ID组合对应的最大日期,再关联回原表拿到完整记录;要么用窗口函数给每个组的记录按日期排序,取排序第一的那条。
1. 通用关联法(适合大多数数据库)
这种写法不依赖数据库特定的窗口函数,兼容性拉满:
SELECT t.* FROM your_table t INNER JOIN ( -- 先获取每个唯一组合的最新日期 SELECT Name, ID, MAX(OnDate) AS latest_date FROM your_table GROUP BY Name, ID ) t_max ON t.Name = t_max.Name AND t.ID = t_max.ID AND t.OnDate = t_max.latest_date;
2. 窗口函数法(推荐,适合支持窗口函数的数据库:Oracle、SQL Server、MySQL 8+等)
如果你之前用排名函数出问题,大概率是用了RANK()或DENSE_RANK()——这两个函数遇到相同日期会给相同排名,导致多条记录被选中。换成ROW_NUMBER()就能解决,它会给每个组内的记录分配唯一的序号:
WITH ranked_records AS ( SELECT *, -- 按Name+ID分组,按OnDate倒序排序,给每条记录标序号 ROW_NUMBER() OVER (PARTITION BY Name, ID ORDER BY OnDate DESC) AS rn FROM your_table ) -- 取每个组内序号为1的记录(也就是最新的那条) SELECT Name, ID, Email, DeptNo, DeptScore, OnDate FROM ranked_records WHERE rn = 1;
如果同一个Name+ID在同一天有多条记录,你可以在ORDER BY里加额外字段,比如ORDER BY OnDate DESC, DeptScore DESC,来指定哪条记录优先被选中。
内容的提问来源于stack exchange,提问作者BFF
相关产品推荐
相关产品推荐

