如何加入才能找到这些结果?

时间:2018-09-03 12:39:36

标签: 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

我想在ID列上加入这些表。目的是在表B中查找每个ID和日期(在表A中每行)的日期等于或晚于表A中的最小日期的日期。

我的意思是输出应该是

OUTPUT

1   2018.01.23
2   2018.01.25
2   2018.05.29
2   2018.09.30

预先感谢

1 个答案:

答案 0 :(得分:5)

您可以尝试一下。

您只需要在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'));

查询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

Results

| 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 |