表a和表b的内部连接,仅选择表b中的一行倍(列n =最大值的行)

时间:2019-02-13 11:47:41

标签: sql

我是SQL的初学者。所以我有两个表(表a和表b) 表a容纳具有唯一ID的人员,表b容纳表a的每个人员的多行以及人员ID(用于可能的联接)。表b中的行按列n row_number排序。

我如何只选择表b中具有最高row_number的行的所有人?

我希望你能对我有所了解。

欢呼

2 个答案:

答案 0 :(得分:0)

如果我说对了:

SELECT a.persons_ID
      ,b.rn 
  FROM A   
INNER JOIN
       (
        SELECT MAX(row_number_column) AS rn
              ,persons_ID
          FROM B 
        GROUP BY persons_ID
        ) sub
     ON sub.persons_ID = A.persons_ID

内部联接中的子选择将表B的数据分组。因此,每个persons_ID仅存在一行-最高row_number_column的行。 最后,只需对persons_ID进行简单的连接即可。

答案 1 :(得分:0)

如果除了个人ID和每个人的最后一个row_number之外,您不需要任何其他信息,那么这很简单。让我们叫第一个表person和第二个visit

select   person_id,
         max(row_number) max_row_number
from     visit
group by person_id

如果您需要 first 表中的其他信息,例如person.name,请执行连接:

select     person.person_id,
           person.name,
           max(visit.row_number) max_row_number
from       person
inner join visit on visit.person_id = person.person_id
group by   person.person_id, 
           person.name

如果您需要 second 表中的其他信息,例如visit.present,则现代数据库支持row_number()窗口函数(不要与您所使用的列混淆)有):

select name, 
       base.row_number,
       present
from (
      select     person.name,
                 row_number() over (partition by visit.person_id 
                                    order by visit.row_number desc) rn,
                 visit.row_number,
                 visit.present
      from       person
      inner join visit on visit.person_id = person.person_id
) base
where rn = 1

NB:我强烈建议将列row_number重命名为其他名称,因为row_number是许多数据库中的分析函数。