(Presto)SQL交叉连接两个表,但仅用于特定的右列



假设我有两个表:"日历";以及";销售";,其中,日历表包含每行的日期(以yyyy-mm-dd格式(,销售表包含3列,一列包含日期,一列带有商店名称,一列具有数量;像这样:

calendar:
date    
==========
2021-03-01
2021-03-02
2021-03-03
...

sales:
date         store     quantity
==================================
2021-03-01        A           10
2021-03-01        B            6
2021-03-02        C           15
2021-03-04        A            8
...

正如你从第二张表中看到的,如果一家商店在某一天的销售额为0,那么这一行根本不存在。我试图实现的是一个填补空白的联合表格,例如:

sales:
date         store     quantity
==================================
2021-03-01        A           10
2021-03-01        B            6
2021-03-01        C            0
2021-03-02        A            0
2021-03-02        B            0
2021-03-02        C           15
2021-03-03        A            0
2021-03-03        B            0
2021-03-03        C            0
...

我设法做到这一点的方式是这样的:

SELECT c.date,
s.store,
t.sales
FROM calendar c

CROSS JOIN (SELECT DISTINCT store FROM sales) s

LEFT JOIN sales t
ON c.date = t.date
AND s.store = t.store

然而,该查询对表"执行双重读取;销售";,我想避免这种情况,因为正在扫描的数据相对较大。

有没有任何方法可以通过对表"执行一次读取来实现同样的结果;销售";?

问题的解决方案是使用一个名为stores的单独表。然后使用此表进行查询:

SELECT c.date, s.store, t.sales
FROM calendar c CROSS JOIN
stores s LEFT JOIN 
sales t
ON c.date = t.date AND s.store = t.store;

对于一张桌子来说,这很棘手。我可以考虑一些优化,但没有一个可以消除扫描。

相关内容

  • 没有找到相关文章

最新更新