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

SQL查询问题:按Employee ID获取唯一最大EXAM_DATE记录失败求助

解决每个Employee ID对应最大EXAM_DATE的问题

嘿,我来帮你搞定这个问题!你遇到的情况其实挺常见的,咱们先拆解下问题出在哪,再给你几个靠谱的解决方案。

为什么用MAX函数还是拿到多条记录?

大概率是你在SELECT里除了EmployeeID和MAX(EXAM_DATE)之外,还包含了其他没有被聚合的列(比如考试分数、科目这类),而且GROUP BY只指定了EmployeeID。这种情况下,数据库会返回每个EmployeeID和其他列的唯一组合行,自然就会出现多条记录。

如果只需要每个员工的ID和最新考试日期,直接用GROUP BY就能解决:

SELECT EmployeeID, MAX(EXAM_DATE) AS LatestExamDate
FROM YourEmployeeExamTable
GROUP BY EmployeeID;

如果需要完整的最新考试记录(比如包含分数、科目等)

这时候GROUP BY就不够用了,推荐用窗口函数,这是处理这类分组取最值场景的最优解之一:

WITH RankedExamRecords AS (
    SELECT 
        *,
        -- 按员工ID分组,按考试日期倒序排名,最新的排第1
        ROW_NUMBER() OVER (PARTITION BY EmployeeID ORDER BY EXAM_DATE DESC) AS RecordRank
    FROM YourEmployeeExamTable
)
SELECT *
FROM RankedExamRecords
WHERE RecordRank = 1;

这个方法能精准拿到每个员工最新考试的完整行数据,逻辑清晰,性能也不错。

修复你的NOT EXISTS语句

你之前尝试的NOT EXISTS没拿到数据,应该是逻辑条件写反了。正确的写法应该是找“不存在同一员工且考试日期比当前行更大的记录”,也就是当前行就是该员工的最新记录:

SELECT e1.*
FROM YourEmployeeExamTable e1
WHERE NOT EXISTS (
    SELECT 1
    FROM YourEmployeeExamTable e2
    WHERE e2.EmployeeID = e1.EmployeeID
      AND e2.EXAM_DATE > e1.EXAM_DATE -- 关键:找比当前行日期更大的记录,如果不存在,当前行就是最新的
);

如果之前你写的是e2.EXAM_DATE < e1.EXAM_DATE,那会拿到最早的记录;要是字段名拼写错误(比如把EmployeeID写成EmpID),也会导致没数据,检查下字段名是否和表结构一致哦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:03:34