Выполнение того, что мне нужно без CROSS JOIN - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть запрос, который тянет из таблицы. С помощью этой таблицы я хотел бы создать запрос, который позволит мне делать прогнозы на будущее.

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 голосов
/ 02 ноября 2018

Используйте таблицу всех дат в качестве «из таблицы» и оставьте данные объединенными слева, они по-прежнему будут возвращать каждую дату.

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

Другой альтернативой (чтобы избежать перекрестного соединения) может быть использование generate series, но для этого - в Redshift - я предлагаю этот прежний ответ . Я фанат генерации рядов, но если у вас уже есть таблица, я, вероятно, останусь с ней (но это основано на том, что я мало знаю о вашем запросе и т. Д.).

...