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
我有以下 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