SQL查询从一列中获取最大值从另一个表联接

时间:2020-03-27 11:56:35

标签: mysql sql

这是我在这里提出的问题的轻微变体 SQL Query for getting maximum value from a column

我有一个包含以下数据的人员表和活动表

-人-----

enter image description here

------活动------------

enter image description here

我已经在数据库中获得了有关用户在特定活动上花费时间的数据。

我打算在每个用户都花了最大时间后才获取数据。

我的查询是

Select p.Id as 'PersonId',
       p.Name as 'Name',
       act.HoursSpent as 'Hours Spent',
       act.Date as 'Date'
       From Person p
       Left JOIN (Select  MAX(HoursSpent), Date from Activity
                    Group By HoursSpent, Date) act
       on act.personId = p.Id

但是它为我提供了Person的所有行,而不是最大花费的小时数。 这应该是我的结果。

enter image description here

1 个答案:

答案 0 :(得分:2)

您的查询有几个问题:

  • 要获取小时数的子查询是按日期而非人员汇总的。
  • 您无法从activity引入 other 列。

您可以采用这种方法-joingroup by,但需要两个联接:

select p.*, a.*  -- the columns you want
from Person p left join
     activity a
     on a.personId = p.id left join
     (select personid, max(HoursSpent) as max_hoursspent
      from activity a
      group by personid
     ) ma
     on ma.personId = a.personId and
        ma.max_hoursspent = a.hoursspent;

请注意,这可以为给定的人返回重复项-如果存在最大的并列关系。

这是用row_number()通俗地写的:

select p.*, a.*  -- the columns you want
from Person p left join
     (select a.*,
             row_number() over (partition by a.personid order by a.hoursspent desc) as seqnum
      from activity a
     ) a
     on a.personId = p.id and a.seqnum = 1
        ma.max_hoursspent = a.hoursspent;