SQL 使用 MAX() 函数 select 字段不在分组依据中

SQL use MAX() function select field not in Group By

我想在我的 table 中找到两个字段的唯一组合的最新条目。

Employee_Number | Cap_Id | Score | Date_Added

我想为一组 Employee_Number 和 Cap_Id 查找最近的 'Date_Added',但还要显示为该组输入的 'Score'。我可以按 Employee_Number 和 Cap_Id 分组以获得结果中我想要的行,但我不能同时显示分数,因为分组依据会将其确定为不同的值。

如果我的 table 看起来像:

Employee_Number Cap_Id  Score   Date_Added
96149             2       4     04/06/2015
96149             2       3     03/06/2015

我想要的结果是:

Employee_Number Cap_Id  Score   Date_Added
96149             2       4     04/06/2015

我可以使用:

SELECT Employee_Number, Cap_Id, MAX(Date_Added)
FROM Scores
GROUP BY Employee_Number, Cap_Id

为了得到正确的结果,但我也需要分数

如果没有其他行具有相同的 Employee_NumberCap_Id 但存在更晚的日期,则跳过 GROUP BY、return 行!

SELECT Employee_Number, Cap_Id, Score, Date_Added
FROM Scores s1
WHERE NOT EXISTS (select 1 from Scores s2
                  where s1.Employee_Number = s2.Employee_Number
                    and s1.Cap_Id = s2.Cap_Id
                    and s1.Date_Added < s2.Date_Added)

如果出现平局,它会 return 两行!

编辑 - 某种解释:

子查询查找具有相同 Employee_NumberCap_Id 但具有更晚的 Date_Added 值的另一行。

如果不存在这样的行,则主 select 中的行是 returned。

什么到select中分select并不重要,重要的是如果排成existsnot exists。 (那是 select 1。如果不重要,您可以 select 子查询中的任何内容。)

我认为你不需要Group by

SELECT Employee_Number, Cap_Id, Score, Date_Added
FROM Scores
WHERE MAX(Date_Added) = Date_Added

如果 Access 不允许您在 where 子句中使用 max(),您也可以试试这个。

SELECT Employee_Number, Cap_Id, Score, Date_Added
FROM Scores AS s1
WHERE  Date_Added = (SELECT MAX(Date_Added) FROM Scores s2 where s1.Employee_Number =  s2.Employee_Number)