SQL使用MAX()函数选择字段不在Group By中

时间:2015-06-04 14:48:17

标签: sql ms-access group-by max

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

Employee_Number | Cap_Id | Score | Date_Added

我想找到最新的' Date_Added'对于一组Employee_Number和Cap_Id,还要显示'分数'输入该组。我可以按Employee_Number和Cap_Id分组以获得我想要的结果,但我也不能将分数显示为分组依据将其确定为不同的值。

如果我的表格如下:

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

要获得正确的结果,但我也需要得分

2 个答案:

答案 0 :(得分:4)

略过GROUP BY,如果没有其他行具有相同的Employee_NumberCap_Id,但是存在更晚的日期,则返回一行!

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)

如果有平局,它会返回两行!

编辑 - 某种解释:

子查询查找具有相同Employee_NumberCap_Id的另一行,但后来的Date_Added值。

如果不存在这样的行,则返回主选择中的行。

在子选择中选择的内容并不重要,重要的是行existsnot exists。 (那是select 1。你可以在子查询中选择任何内容,如果无关紧要。)

答案 1 :(得分:4)

我认为您不需要分组

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)

如果Access不允许您在where子句中使用 max(),也可以尝试此操作。

empty