如何解决(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;
只有一张桌子,这很棘手。我可以想到一些优化,但没有一个可以消除扫描。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。