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

问题描述

假设我有两个表:“calendar”和“sales”,其中日历表包含每一行的日期(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
...

从第 2 个表中可以看出,如果商店在特定日期的销售额为 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

然而,这个查询对表“sales”执行了双重读取,我想避免这种情况,因为被扫描的数据相对较大。

有什么办法可以通过对表“sales”执行一次读取来获得相同的结果?

解决方法

解决您的问题的方法是使用一个名为 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;

只有一张桌子,这很棘手。我可以想到一些优化,但没有一个可以消除扫描。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...