我有两张桌子,比如用户和访谈。一个用户可以拥有多个访谈记录。
Users
-----
UserID
FirstName
LastName
Interviews
----------
InterviewID
UserID
DateOfInterview
我想获得最新的采访记录。这是我的查询
select u.UserID, firstname, lastname, max(DateOfInterview) as latestDOI
from users u
left join interviews i
on u.UserID = i.UserID
GROUP BY u.UserID, firstname, lastname
ORDER BY max(DateOfInterview) DESC
如何更新查询以返回InterviewID(即对应于max(DateOfInterview)的那个)?
答案 0 :(得分:1)
您可以在WHERE
子句中使用聚合子查询,而不是在选择列表中使用聚合函数:
select u.UserID, firstname, lastname, i.InterviewId, DateOfInterview as latestDOI
from users u
left join interviews i
on u.UserID = i.UserID
where i.UserId is null or i.DateOfInterview = (
select max(DateOfInterview)
from interviews i2
where i2.UserId = u.UserId
)
这确实假设max(DateOfInterview)
每个用户都是唯一的,但问题没有明确定义的答案。请注意,主查询不再是聚合查询,因此不适用此类查询的约束。
还有其他方法可以解决这个问题,因此查看它们是值得的,因为我提出的相关子查询可能是一个性能问题。例如,您可以使用内联视图生成每个用户最新访谈日期的表格,并使用该视图的连接来将用户与其最新访谈的ID相关联:
select u.*, im.latestDOI, i2.InterviewId
from
users u
left join (
select UserID, max(DateOfInterview) as latestDOI
from interviews i
group by UserID
) im
on u.UserId = im.UserId
left join interviews i2
on im.UserId = i2.UserId and im.latestDOI = i2.DateOfInterview
还有其他选择,一些是标准的,另一些是特定于DB的。
答案 1 :(得分:0)
在抓取面试时重写使用OUTER APPLY,这样你可以使用order而不是MAX
select u.UserID, firstname, lastname, LatestInterviewDetails.ID, LatestInterviewDetails.DateOfInterview as latestDOI
from users u
OUTER APPLY (SELECT TOP 1 Id, DateOfInterview
FROM interviews
WHERE interviews.UserID = u.UserId
ORDER BY interviews.DateOfInterview DESC
) as LatestInterviewDetails
注意:这表示您使用的是Microsoft SQL Server