连接两个表并获取给定名称的最新记录

我有一个将记录插入到两个表中的系统(Oracle db,但是我猜这是一个常见的SQL问题):

Person表和Person_Record表(一对一关系)

Person表具有插入日期,这在以后很重要。

要查询的是:两个表之间的联接,但仅提供给定人员的最新数据。例如:

Person Table
ID| Name |   Date
--------------------------
1 |  A   | 2012-05-01
2 |  A   | 2012-05-02
3 |  B   | 2012-05-04


Person Record Table
ID| Person_Id |   Data
--------------------------
1 |  1   | my data 1
2 |  2   | my data 2
3 |  3   | my data 3

如果我这样做:

    SELECT pr.record_id,p.person_name,FROM PERSON p
    INNER JOIN PERSON_RECORD pr
        ON (p.person_id = pr.person_id)

我将为名称为“ A”的人返回2行,为“ B”返回1条记录,但我不在乎人为“ A”的第一行(从2012-05-01开始) 。我尝试使用distinct来消除重复(在名称上),但是我需要保证我要获取该特定名称的最新日期。感觉我缺少明显的东西,但我无法点击它。

zz315274061 回答:连接两个表并获取给定名称的最新记录

您似乎想要给定NAME的最新记录。如果是这样,您可以使用相关子查询来匹配名称的日期:

SELECT pr.record_id,p.person_name,FROM PERSON p INNER JOIN
     PERSON_RECORD pr
     ON p.person_id = pr.person_id
WHERE p.date = (SELECT MAX(p2.date)
                FROM PERSON p2
                WHERE p2.name = p.name
               );
,

一种选择是按日期对人员行进行排名:

SQL> with
  2  person (id,name,cdate) as
  3    (select 1,'A',date '2012-05-01' from dual union all
  4     select 2,date '2012-05-02' from dual union all
  5     select 3,'B',date '2012-05-04' from dual
  6    ),7  person_record (id,person_id,data) as
  8    (select 1,1,'my data 1' from dual union all
  9     select 2,2,'my data 2' from dual union all
 10     select 3,3,'my data 3' from dual
 11    ),12  ranking as
 13    (select id,cdate,14            row_number() over (partition by name order by cdate desc) rn
 15     from person
 16    )
 17  select pr.id,p.name,p.cdate
 18  from ranking p join person_record pr on p.id = pr.person_id
 19  where p.rn = 1;

        ID N CDATE
---------- - ----------
         2 A 2012-05-02
         3 B 2012-05-04

SQL>
,

一个由其姓名标识的人可以在person表中具有多个条目。您只需要具有最新条目的行。在Oracle中,您可以使用KEEP LAST

select *
from 
(
  select name,max(id) keep (dense_rank last order by date) as last_id
  from person
  group by name
) p 
left join person_record pr on pr.person_id = p.last_id
order by p.last_id;

(如果ID总是递增,则只需使用max(id)并忽略课程日期即可。)

本文链接:https://www.f2er.com/2963229.html

大家都在问