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

