无需交叉加入即可满足我的需求

时间:2018-11-02 03:43:45

标签: postgresql amazon-redshift cross-join

我有一个从表中提取的查询。借助此表,我想构建一个查询,使我可以对未来进行预测。

SELECT
b.date,
a.id,
SUM(CASE WHEN a.date = b.date THEN a.sales ELSE 0 END) sales,
SUM(CASE WHEN a.date = b.date THEN a.revenue ELSE 0 END) revenue
FROM
table_a a
CROSS JOIN table_b b
WHERE a.date BETWEEN '2018-10-31' AND '2018-11-04'
GROUP BY 1,2

table_b是一个表,实际上只有一列,其中包含将来的日期。这将返回如下结果:

+----------+--------+-------+---------+
|   date   |   id   | sales | revenue |
+----------+--------+-------+---------+
| 11/4/18  | 113972 |     0 |       0 |
| 11/4/18  | 111218 |     0 |       0 |
| 11/3/18  | 111218 |     0 |       0 |
| 11/3/18  | 113972 |     0 |       0 |
| 11/2/18  | 111218 |     0 |       0 |
| 11/2/18  | 113972 |     0 |       0 |
| 11/1/18  | 111218 |    89 | 2405.77 |
| 11/1/18  | 113972 |   265 | 3000.39 |
| 10/31/18 | 111218 |    64 | 2957.71 |
| 10/31/18 | 113972 |   120 | 5650.91 |
+----------+--------+-------+---------+

在此之后,现在还有更多查询要查询的内容,而不是其中的内容,但是出于这个问题的目的,这就是您所需要的,因为它是CROSS JOIN所在的地方。

如何在不使用CROSS JOIN的情况下重新创建这些结果?实际上,此查询的日期范围要大得多,需要更多数据,并且要花费数小时,并且运行起来会非常耗电,我知道应尽可能避免使用CROSS JOIN

1 个答案:

答案 0 :(得分:1)

使用所有日期的表作为“来自表”,并左键联接数据,这仍会返回每个日期。

href

另一个避免交叉连接的方法是使用SELECT d.date , t.id , COALESCE(SUM(t.sales),0) sales , COALESCE(SUM(t.revenue),0) revenue FROM all_dates d LEFT JOIN table_data t ON d.date = t.date WHERE d.date BETWEEN '2018-10-31' AND '2018-11-04' GROUP BY d.date , t.id ,但为此-在Redshift中,我建议使用this former answer。我是generate系列的忠实支持者,但是如果您已经有了一个表,我可能会保留它(但这是基于我对您的查询等了解的很少。)