Смешивание CROSS JOIN с LEFT JOIN на Redshift - PullRequest
0 голосов
/ 23 февраля 2019

У меня есть две таблицы: accounts и opportunities.Одна учетная запись имеет 0 - n возможностей, но только 0 или 1 возможностей в любой момент времени (в пределах диапазона contract_from / contract_to).

Я хочу сообщитьза последние 4 месяца какая учетная запись имела такую ​​возможность в этом месяце.

Я задал этот запрос:

WITH numbers AS (SELECT 1 AS n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4)
    SELECT * FROM
      (
        (SELECT id, name FROM accounts WHERE is_active) AS acc(acct_id, name)
        CROSS JOIN
        (SELECT dateadd(MONTH, -n,
                date_trunc('month', current_date))::date AS start,
                dateadd(DAY, -1, dateadd(MONTH, -n + 1,
                date_trunc('month', current_date)))::date AS stop
         FROM numbers) AS period(start, stop)
      )
      LEFT OUTER JOIN
      (SELECT acct_id, subscription_type, contract_from, contract_to
       FROM opportunities) AS opp(acct_id, subscription, start, stop)
      ON (acc.acct_id = opp.acct_id AND
          opp.start <= period.start AND
         (opp.stop ISNULL OR
          opp.stop > period.stop))

Моя проблема в том, что некоторые учетные записи имеют только две результирующие строкиДаже если вы сделали левое соединение, я ожидаю, что у них всегда будет четыре строки с месяцами без активной возможности, что приведет к значениям null в столбцах subscription, start и stop.

Смешивание этих объединений не поддерживается в Redshift?

1 Ответ

0 голосов
/ 23 февраля 2019

После еще нескольких итераций в моем запросе я обнаружил, что левое соединение действительно работает, но порядок перепутан.Строки с nulls заканчиваются дальше вниз.Вероятно, потому что Redshift сначала выполняет левое соединение, а , а затем «заполняет» строки, у которых нет соответствующего правильного соответствия.

Также: OUTER JOIN здесь неправильный выбор, потому чтоесли на данную дату имеется более 1 возможности, то дополнительная возможность вызывает больше результирующих строк.

...