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

如何从含两列唯一值的关联表中获取最新日期?已尝试排名与rownum=1未解决

如何从关联表中按唯一组合获取最新日期的记录?

我最近碰到个棘手的问题:要从一张以Name和ID作为唯一值组合的关联表里,取出每个组合对应的最新日期记录。试了排名函数却发现John出现了相同排名,用rownum = 1的方法也没得到想要的结果,当前查到的结果是这样的:

NameIDEmailDeptNoDeptScoreOnDate
JohnA46john@doe.com100505/11/2011
JohnA46johndoe@aol.com200757/21/2015
AliceB33alice@hotmail.com100504/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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:34:00