一个SQL书写的问题

新手上路,请多包涵

有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');

希望实现如下效果

idiyearimonthiyear_bimonth_bnumrow_nu
120190120190851
120190220190851
120190320190851
120190420190851
120190520190851
120190620190851
120190720190851
120190820190851
120190920200541
120191020200541
120191120200541
120191220200541
120200120200541
120200220200541
120200320200541
120200420200541
120200520200541
120200620201131
120200720201131
120200820201131
120200920201131
120201020201131
120201120201131
120201220210921
120210120210921
120210220210921
120210320210921
120210420210921
120210520210921
120210620210921
120210720210921
120210820210921
120210920210921
1202110 1
1202111 1
1202112 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部分的数据就会翻倍许多,是否有更好的写法来实现相同的效果呢?

阅读 718
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进