仅当最小值小于另一表中的值时才在一个表中加入值 - 雪花
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) [重复]