У меня есть две таблицы: 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?