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_Number
和 Cap_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_Number
和 Cap_Id
但具有更晚的 Date_Added
值的另一行。
如果不存在这样的行,则主 select 中的行是 returned。
什么到select中分select并不重要,重要的是如果排成exists
或not 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)
我想在我的 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_Number
和 Cap_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_Number
和 Cap_Id
但具有更晚的 Date_Added
值的另一行。
如果不存在这样的行,则主 select 中的行是 returned。
什么到select中分select并不重要,重要的是如果排成exists
或not 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)