【发布时间】:2019-02-23 14:20:52
【问题描述】:
我有两张桌子: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 列中的值 @ 987654331@、start 和 stop。
Redshift 不支持混合这些联接吗?
【问题讨论】:
标签: left-join amazon-redshift cross-join