在Redshift上将CROSS JOIN与LEFT JOIN混合使用

问题描述 投票:0回答:1

我有两张桌子:accountsopportunities。一个帐户有0-n机会,但在任何时间点(在0 / 1范围内)只有contract_fromcontract_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))

我的问题是,有些帐户只有两个结果行,即使你做了左连接,所以我希望它们总是有四行,没有活跃的机会导致nullsubscriptionstart列中的stop值。

在Redshift中不支持混合这些连接吗?

left-join amazon-redshift cross-join
1个回答
0
投票

在对我的查询进行了一些迭代之后,我发现左连接确实有效,但顺序混淆了。带有nulls的行最终进一步下降。可能是因为Redshift首先执行左连接,然后“填充”没有相应右匹配的行。

另外:OUTER JOIN在这里是错误的选择,因为如果在给定日期有超过1个机会,那么额外的机会会导致更多的结果行。

© www.soinside.com 2019 - 2024. All rights reserved.