Ers*_*har 0 sql oracle join oracle11g greatest-n-per-group
表AA
table AA
ID Date
1 2018.01.21
2 2018.01.22
2 2018.05.27
2 2018.07.15
table BB
ID Date
1 2017.05.21
1 2017.08.27
1 2018.01.23
1 2018.02.15
2 2017.01.01
2 2017.05.31
2 2018.01.01
2 2018.01.25
2 2018.05.29
2 2018.09.30
Run Code Online (Sandbox Code Playgroud)
我想在ID列上加入这些表.目的是在表B中找到与表A中的最小日期相同或更晚的日期,每个id和日期(在每行的表A上).
我的意思是输出应该是
OUTPUT
1 2018.01.23
2 2018.01.25
2 2018.05.29
2 2018.09.30
Run Code Online (Sandbox Code Playgroud)
提前致谢
你可以试试这个.
你只需要编写一个子查询select并MIN从BB表中获取日期.
CREATE TABLE AA(
ID INT,
"DATE" DATE
);
INSERT INTO AA VALUES(1,to_date('2018-01-21','yyyy-MM-dd'));
INSERT INTO AA VALUES(2,to_date('2018-01-22','yyyy-MM-dd'));
INSERT INTO AA VALUES(2,to_date('2018-05-27','yyyy-MM-dd'));
INSERT INTO AA VALUES(2,to_date('2018-07-15','yyyy-MM-dd'));
CREATE TABLE BB(
ID INT,
"DATE" DATE
);
INSERT INTO BB VALUES(1,to_date('2017-05-21','yyyy-MM-dd'));
INSERT INTO BB VALUES(1,to_date('2017-08-27','yyyy-MM-dd'));
INSERT INTO BB VALUES(1,to_date('2018-01-23','yyyy-MM-dd'));
INSERT INTO BB VALUES(1,to_date('2018-02-15','yyyy-MM-dd'));
INSERT INTO BB VALUES(2,to_date('2017-01-01','yyyy-MM-dd'));
INSERT INTO BB VALUES(2,to_date('2017-05-31','yyyy-MM-dd'));
INSERT INTO BB VALUES(2,to_date('2018-01-01','yyyy-MM-dd'));
INSERT INTO BB VALUES(2,to_date('2018-01-25','yyyy-MM-dd'));
INSERT INTO BB VALUES(2,to_date('2018-05-29','yyyy-MM-dd'));
INSERT INTO BB VALUES(2,to_date('2018-07-31','yyyy-MM-dd'));
INSERT INTO BB VALUES(2,to_date('2018-09-30','yyyy-MM-dd'));
Run Code Online (Sandbox Code Playgroud)
查询1:
SELECT a1.Id,(
SELECT MIN(b1."DATE")
FROM BB b1
where a1.ID = b1.ID and b1."DATE" >= a1."DATE"
) "Date"
FROM AA a1
Run Code Online (Sandbox Code Playgroud)
结果:
| ID | Date |
|----|----------------------|
| 1 | 2018-01-23T00:00:00Z |
| 2 | 2018-01-25T00:00:00Z |
| 2 | 2018-05-29T00:00:00Z |
| 2 | 2018-07-31T00:00:00Z |
Run Code Online (Sandbox Code Playgroud)