我有一个从表中提取的查询。借助此表,我想构建一个查询,使我可以对未来进行预测。
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
。
答案 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系列的忠实支持者,但是如果您已经有了一个表,我可能会保留它(但这是基于我对您的查询等了解的很少。)