我如何执行左联接比较两个月的列,然后一个接一个地接另一个?

问题描述 投票:0回答:1

这里是东西,我必须要桌子,我想加入它们。但是,我想基于一个相等和另一个比较来带来这些值。就像我要在两个表的id相同并且表1的另一列必须在表2的同一列之下时带值一样。这是我的两个表:

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

这是东西,我想带我桌子的价格更新。但是我没有每个月的价格,只是价格有所更新。基本上,我的最终表是这样:

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月的价格。我怎样才能使这个左连接正确?

sql postgresql join left-join
1个回答
0
投票

您可以使用横向连接:

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;

请注意,通常在进行此类比较时,比较将使用<=而不是<

© www.soinside.com 2019 - 2024. All rights reserved.