MySQL-从多个联接表中“选择最大值”不会返回正确的值

时间:2019-09-19 14:52:40

标签: mysql sql greatest-n-per-group

我有两个表-一个表是地址列表,另一个表是出勤日期和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?认为这与“最伟大的每组”讨论有关,但是我看不到如何使用已经具有联接的查询来实现该代码

2 个答案:

答案 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;

请注意,这还会保留所有站点(这似乎是您的意图),即使是尚未访问的站点。