如何执行左连接比较两个月的列,并将一个列紧接着另一个列?

vcirk6k6  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(540)

事情是这样的,我必须加入表格,我想加入他们。但是,我想把这些值建立在一个等式和另一个比较的基础上。这就好像我想在两个表的id相同,而表1的另一列必须在表2的同一列下面的时候引入这个值。这是我的两张table:
表1(销售表):

id    produts_sold    month
A1    100             '2020-01-01'
A3    500             '2020-01-01'
A1    100             '2020-02-01'
A2    300             '2020-02-01'
A3    200             '2020-02-01'
A1    400             '2020-04-01'
A2    500             '2020-04-01'
A1    400             '2020-06-01'
A1    500             '2020-08-01'

表2(价格表-显示价格更新的时间)

id    price    month
A1    100      '2019-12-01'
A2    200      '2019-12-01'
A3    300      '2019-12-01'
A1    200      '2020-02-01'
A1    400      '2020-03-01'

事情是这样的,我想给我的table带来最新的价格。但是我没有每个月的价格,就在更新的时候。基本上,我的最后一张table是这样的:

id    produts_sold    month             price
A1    100             '2020-01-01'      100
A3    500             '2020-01-01'      300
A1    100             '2020-02-01'      200
A2    300             '2020-02-01'      200
A3    200             '2020-02-01'      300
A1    400             '2020-04-01'      400
A2    500             '2020-04-01'      200
A1    400             '2020-06-01'      400
A1    500             '2020-08-01'      400

以下是我迄今为止尝试过的:

select t1.*, t2.price
   from table_1 t1
   left join table_2 t2
        on t1.id=t2.id and t1.month > t2.month

然而,这并不奏效。因为2月20日是12月19日之后,但是4月20日也是12月19日之后,我可能会在3月份得到4月份的价格,而不是2月份的价格。我怎样才能把这个左连接右?

shstlldc

shstlldc1#

可以使用横向连接:

select t1.*, t2.price
from table_1 t1 left join lateral
     (select t2.*
      from table2 t2
      where t2.id = t1.id and t2.month < t1.month
      order by t2.month desc
      limit 1
     ) t2
     on true;

请注意,通常在进行此类比较时,比较将使用 <= 而不是 < .
在这种情况下,还可以使用相关子查询:

select t1.*,
       (select t2.price
        from table2 t2
        where t2.id = t1.id and t2.month < t1.month
        order by t2.month desc
        limit 1
       ) as price
from table_1 t1;

相关问题