sql - 连接两个表并获取给定名称的最新记录
问题描述
我有一个将记录插入两个表的系统(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 来消除重复项(在名称上),但我需要保证我获得了该特定名称的最新日期。感觉好像我错过了一些明显的东西,但我无法点击它。
解决方案
一种选择是按日期对人员行进行排名:
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>
推荐阅读
- excel - 使用宏将公式粘贴到一系列单元格中
- c# - IBM MQ Windows 客户端 C# 连接到服务器失败并出现 2298 错误
- php - PHP strtotime 获取给定年份的最后一天
- c# - 我使用了太多的 if 语句
- javascript - chart.js 数据通过 API 根据选择动态形成
- mysql - 这种情况下怎么写SQL?
- python - 日期范围内的 xlsxwriter
- google-apps-script - 电子表格插件身份验证错误 - 文档所有者和活动用户不匹配
- angular - 如何正确地将带有 i18n 的 Angular 6 应用程序构建到带有 baseHref 的“语言环境目录”中?
- php - 根据邮政编码计算邮费