Oracle 查询查找一个人的第 N 个最早的访问

Oracle Query to find the Nth oldest visit of a person

我有以下 Oracle table

PersonID VisitedOn
1 1/1/2017
1 1/1/2018
1 1/1/2019
1 1/1/2020
1 2/1/2020
1 3/1/2020
1 5/1/2021
1 6/1/2022
2 1/1/2015
2 1/1/2017
2 1/1/2018
2 1/1/2019
2 1/1/2020
2 2/1/2020
3 1/1/2017
3 1/1/2018
3 1/1/2019
3 1/1/2020
3 2/1/2020
3 3/1/2020
3 5/1/2021

我试着写一个查询 return 每个人的第 N 个最早的访问。 例如,如果我想 return 第 5 个最旧的访问 (N=5),结果将是

PersonID VisitDate
1 1/1/2020
2 1/1/2017
3 1/1/2019

我认为这会起作用: 运行 使用此数据进行测试:

create table test (PersonID  number,   VisitedOn date);
insert into test values(1,'01-JAN-2000');
insert into test values(1,'01-JAN-2001');
insert into test values(1,'01-JAN-2002');
insert into test values(1,'01-JAN-2003');
insert into test values(2,'01-JAN-2000');
insert into test values(2,'01-JAN-2001');

select personid, visitedon
from (
  select personid, 
         visitedon, 
         row_number() over ( partition by personid order by visitedon )  rn
  from test
)
where rn=5

它的作用是使用分析函数为按人员 ID 分区的每组记录分配一个行号,然后从每个分区组中选择第 N 行,其中每个组中的行按日期排序。如果您 运行 内部查询本身,您将看到 row_number 分配的位置:

PERSONID    VISITEDON   RN
1   01-JAN-00   1
1   01-JAN-01   2
1   01-JAN-02   3
1   01-JAN-03   4
2   01-JAN-00   1
2   01-JAN-01   2