有AB两个表结构如下
CREATE TABLE a
(
id varchar(1) NULL
, iyear varchar(4) NULL
, imonth varchar(2) NULL
);
CREATE TABLE b
(
id varchar(1) NULL
, iyear varchar(4) NULL
, imonth varchar(2) NULL
, num int4 NULL
);
数据内容如下
INSERT INTO b (id, iyear, imonth, num) VALUES('1', '2019', '08', 5);
INSERT INTO b (id, iyear, imonth, num) VALUES('1', '2020', '05', 4);
INSERT INTO b (id, iyear, imonth, num) VALUES('1', '2020', '11', 3);
INSERT INTO b (id, iyear, imonth, num) VALUES('1', '2021', '09', 2);
INSERT INTO a (id, iyear, imonth) VALUES('1', '2019', '01');
INSERT INTO a (id, iyear, imonth) VALUES('1', '2019', '02');
INSERT INTO a (id, iyear, imonth) VALUES('1', '2019', '03');
INSERT INTO a (id, iyear, imonth) VALUES('1', '2019', '04');
INSERT INTO a (id, iyear, imonth) VALUES('1', '2019', '05');
INSERT INTO a (id, iyear, imonth) VALUES('1', '2019', '06');
INSERT INTO a (id, iyear, imonth) VALUES('1', '2019', '07');
INSERT INTO a (id, iyear, imonth) VALUES('1', '2019', '08');
INSERT INTO a (id, iyear, imonth) VALUES('1', '2019', '09');
INSERT INTO a (id, iyear, imonth) VALUES('1', '2019', '10');
INSERT INTO a (id, iyear, imonth) VALUES('1', '2019', '11');
INSERT INTO a (id, iyear, imonth) VALUES('1', '2019', '12');
INSERT INTO a (id, iyear, imonth) VALUES('1', '2020', '01');
INSERT INTO a (id, iyear, imonth) VALUES('1', '2020', '02');
INSERT INTO a (id, iyear, imonth) VALUES('1', '2020', '03');
INSERT INTO a (id, iyear, imonth) VALUES('1', '2020', '04');
INSERT INTO a (id, iyear, imonth) VALUES('1', '2020', '05');
INSERT INTO a (id, iyear, imonth) VALUES('1', '2020', '06');
INSERT INTO a (id, iyear, imonth) VALUES('1', '2020', '07');
INSERT INTO a (id, iyear, imonth) VALUES('1', '2020', '08');
INSERT INTO a (id, iyear, imonth) VALUES('1', '2020', '09');
INSERT INTO a (id, iyear, imonth) VALUES('1', '2020', '10');
INSERT INTO a (id, iyear, imonth) VALUES('1', '2020', '11');
INSERT INTO a (id, iyear, imonth) VALUES('1', '2020', '12');
INSERT INTO a (id, iyear, imonth) VALUES('1', '2021', '01');
INSERT INTO a (id, iyear, imonth) VALUES('1', '2021', '02');
INSERT INTO a (id, iyear, imonth) VALUES('1', '2021', '03');
INSERT INTO a (id, iyear, imonth) VALUES('1', '2021', '04');
INSERT INTO a (id, iyear, imonth) VALUES('1', '2021', '05');
INSERT INTO a (id, iyear, imonth) VALUES('1', '2021', '06');
INSERT INTO a (id, iyear, imonth) VALUES('1', '2021', '07');
INSERT INTO a (id, iyear, imonth) VALUES('1', '2021', '08');
INSERT INTO a (id, iyear, imonth) VALUES('1', '2021', '09');
INSERT INTO a (id, iyear, imonth) VALUES('1', '2021', '10');
INSERT INTO a (id, iyear, imonth) VALUES('1', '2021', '11');
INSERT INTO a (id, iyear, imonth) VALUES('1', '2021', '12');
希望实现如下效果
id | iyear | imonth | iyear_b | imonth_b | num | row_nu |
---|---|---|---|---|---|---|
1 | 2019 | 01 | 2019 | 08 | 5 | 1 |
1 | 2019 | 02 | 2019 | 08 | 5 | 1 |
1 | 2019 | 03 | 2019 | 08 | 5 | 1 |
1 | 2019 | 04 | 2019 | 08 | 5 | 1 |
1 | 2019 | 05 | 2019 | 08 | 5 | 1 |
1 | 2019 | 06 | 2019 | 08 | 5 | 1 |
1 | 2019 | 07 | 2019 | 08 | 5 | 1 |
1 | 2019 | 08 | 2019 | 08 | 5 | 1 |
1 | 2019 | 09 | 2020 | 05 | 4 | 1 |
1 | 2019 | 10 | 2020 | 05 | 4 | 1 |
1 | 2019 | 11 | 2020 | 05 | 4 | 1 |
1 | 2019 | 12 | 2020 | 05 | 4 | 1 |
1 | 2020 | 01 | 2020 | 05 | 4 | 1 |
1 | 2020 | 02 | 2020 | 05 | 4 | 1 |
1 | 2020 | 03 | 2020 | 05 | 4 | 1 |
1 | 2020 | 04 | 2020 | 05 | 4 | 1 |
1 | 2020 | 05 | 2020 | 05 | 4 | 1 |
1 | 2020 | 06 | 2020 | 11 | 3 | 1 |
1 | 2020 | 07 | 2020 | 11 | 3 | 1 |
1 | 2020 | 08 | 2020 | 11 | 3 | 1 |
1 | 2020 | 09 | 2020 | 11 | 3 | 1 |
1 | 2020 | 10 | 2020 | 11 | 3 | 1 |
1 | 2020 | 11 | 2020 | 11 | 3 | 1 |
1 | 2020 | 12 | 2021 | 09 | 2 | 1 |
1 | 2021 | 01 | 2021 | 09 | 2 | 1 |
1 | 2021 | 02 | 2021 | 09 | 2 | 1 |
1 | 2021 | 03 | 2021 | 09 | 2 | 1 |
1 | 2021 | 04 | 2021 | 09 | 2 | 1 |
1 | 2021 | 05 | 2021 | 09 | 2 | 1 |
1 | 2021 | 06 | 2021 | 09 | 2 | 1 |
1 | 2021 | 07 | 2021 | 09 | 2 | 1 |
1 | 2021 | 08 | 2021 | 09 | 2 | 1 |
1 | 2021 | 09 | 2021 | 09 | 2 | 1 |
1 | 2021 | 10 | 1 | |||
1 | 2021 | 11 | 1 | |||
1 | 2021 | 12 | 1 |
即用发生月份时的数值来填充之前的月份,直到遇到不为空的月份,比如19年8月有发生,则19年1-7月均为8月的值,20年5月有发生则19年9月-20年4月均为20年5月的值
SELECT
*
FROM
(
SELECT
a.id
, a.iyear
, a.imonth
, b.iyear iyear_b
, b.imonth imonth_b
, b.num
, ROW_NUMBER() OVER(PARTITION BY a.id,a.iyear,a.imonth order by concat(b.iyear,b.imonth) ) row_nu
FROM a
LEFT JOIN b
ON a.id = b.id
AND concat(a.iyear,a.imonth) <= concat(b.iyear,b.imonth)
) A
WHERE row_nu = 1
;
我写了一个解决方法,可以通过窗口函数排序后得到正确的值,但当B表中数据多的时候会出现多条关联结果A部分的数据就会翻倍许多,是否有更好的写法来实现相同的效果呢?