首页 > 解决方案 > 连接两个表并获取给定名称的最新记录

问题描述

我有一个将记录插入两个表的系统(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 年 5 月 1 日起)。我曾尝试使用 distinct 来消除重复项(在名称上),但我需要保证我获得了该特定名称的最新日期。感觉好像我错过了一些明显的东西,但我无法点击它。

标签: sqloracleoracle11ggreatest-n-per-group

解决方案


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

SQL> with
  2  person (id, name, cdate) as
  3    (select 1, 'A', date '2012-05-01' from dual union all
  4     select 2, 'A', 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, name, 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>

推荐阅读