在Redshift上混合CROSS JOIN和LEFT JOIN

时间:2019-02-23 14:20:53

标签: left-join amazon-redshift cross-join

我有两个表: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))

我的问题是,即使您进行了左联接,有些帐户也只有两个结果行,因此我希望它们始终有四行,而没有活动机会的月份会导致null的值列subscriptionstartstop

是否混合了Redshift不支持的这些联接?

1 个答案:

答案 0 :(得分:0)

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

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