我有两个表-一个表是地址列表,另一个表是出勤日期和EmployeeIDNumbers来标识出出勤的工程师。工程师可能多次参加了演讲。我正在尝试选择地址名称,最近的出勤日期和相应的EngineerID
select s.sitename, max(sd.scheduleddate), sd.EngineerID
from sites as s
left join scheduled_dates as sd on sd.idsites = s.idsites
group by s.idsites
此代码正确提取每个地址和最新的“计划日期”,但没有提取正确的相应工程师ID。如何从与max(scheduleddate)相同的行中获取EngineerID?认为这与“最伟大的每组”讨论有关,但是我看不到如何使用已经具有联接的查询来实现该代码
答案 0 :(得分:0)
您可以将NOT EXISTS
条件与相关子查询一起使用:
select s.sitename, sd.EngineerID, sd.scheduleddate
from sites as s
inner join scheduled_dates as sd on sd.idsites = s.idsites
where not exists (
select 1
from scheduled_dates sd1
where sd1.idsites = s.idsites
and sd1.scheduleddate > sd.scheduleddate
)
条件确保当前站点的scheduled_dates
中不存在其他日期大于所选记录中日期的其他记录。
注意:由于您认为LEFT JOIN
更适合您的用例,因此我将您INNER JOIN
转到了git log --graph --oneline
。
答案 1 :(得分:0)
在MySQL 8+中,您可以使用窗口函数:
select s.sitename, sd.scheduleddate, sd.EngineerID
from sites s left join
(select sd.*,
row_number() over (partition by sd.idsites orer by sd.scheduleddate desc) as seqnum
from scheduled_dates sd
) sd
on sd.idsites = s.idsites and sd.seqnum = 1;
请注意,这还会保留所有站点(这似乎是您的意图),即使是尚未访问的站点。