仅当最小值小于另一表中的值时才在一个表中加入值 - 雪花

Posted

技术标签:

【中文标题】仅当最小值小于另一表中的值时才在一个表中加入值 - 雪花【英文标题】:Join values in one table only when the minimum value is less than value in other table - snowflake 【发布时间】:2021-03-11 18:28:01 【问题描述】:

我有两张桌子:

表 A

Purchase_date Product_ID
20200101 1
20190101 2
20200301 1
20201201 2

表 B

Product_ID Price Price_change_date
1 10 20191231
2 15 20201031
1 12 20200110
1 20 20201231
2 8 20190331

我想根据两个条件加入这两个表:

    如果purchase_date 否则返回小于 purchase_date 的 max(price_change_date) 价格

我编写了一个查询来成功获取第二个条件的结果,但不是第一个条件,我不确定它们是否可以在同一个查询中组合。

上表的结果应该是:

结果

Purchase_date Product_ID Price Price_change_date
20200101 1 10 20191231
20190101 2 8 20190331
20200301 1 12 20200110
20201201 2 15 20201031

请注意,第二行是返回购买日期早于 price_change_date 的价格。

提前致谢!!

【问题讨论】:

【参考方案1】:

您可以使用横向连接:

select a.*, b.*
from a, lateral
     (select b.*
      from b
      where b.product_id = a.product_id and b.price_change_date <= a.purchase_date
     order by b.price_change_date desc
     limit 1
    ) b;

编辑:

以上为您提供了最新的价格变化信息。如果你想在原价之前记录a,那么你可以使用:

select a.*
from a left join
     (select b.product_id, min(b.price_change_date) as min_price_change_date
      from b
      group by product_id
     ) b
     on a.purchase_date < b.price_change_date;

【讨论】:

嗨,戈登,我认为这回答了第一个标准,但不是第二个。然而,当我在雪花中尝试这个时,我收到一个错误:SQL 编译错误:无法评估不支持的子查询类型 @SeanG17 。 . .这就是order by 所做的。 我仍然收到 SQL 错误。另一个问题是,这些结果还将为我提供这些产品的价格,这些产品的价格与购买日期之前的 price_change_date 相关联。我只想使用购买日期之后 price_change_date 最早的产品的价格。 @SeanG17 。 . .我误解了这个问题。

以上是关于仅当最小值小于另一表中的值时才在一个表中加入值 - 雪花的主要内容,如果未能解决你的问题,请参考以下文章

更新查询以根据另一表中的值更改一个表中列的现有值

将一个表中的值与另一表中具有相同属性的值的平均值计算进行比较

仅当前面有 (\d2 -) 时才在 html 中查找链接 (href) [重复]

仅当表中不存在该值时才更新 SQL 列

如何解决ORACLE中表一得列名的别名为另一表中的某一字段的值?

仅当连接明确时才更新行