如何在没有相等条件的情况下编写BigQuery左联接

时间:2020-06-17 09:08:19

标签: google-cloud-platform google-bigquery

我正在将大量代码从MySQL移到BigQuery中,我们当前的许多报告都引用了日期维度,以计算开始和结束之间的周末和假日的天数。我在这里查看了很多其他答案,主要的建议似乎是使用交叉联接,但是我花了半天左右的时间来尝试不同的方法,但还是做不到工作是因为围绕不同日期的逻辑?我在下面放置了核心代码-有人可以建议将其移植到BigQuery的最佳方法吗?我不断收到错误消息:“如果没有这样的条件,就不能使用LEFT OUTER JOIN,即连接两端的字段均相等”。

Date Table Layout:
dateKey int
fullDate date (dd-mm-yyyy format)
isHoliday tinyint
isWeekend tinyint

...以及与此查询不相关的许多其他字段。从1950年到2200年,每个日期都有一行。

select
    purchaseOrders.orderID,
    purchaseOrders.orderExpectedDate,
    purchaseOrders.orderDeliveredDate,
    purchaseOrders.orderCompletedDate,
    (dateDelivered.dateKey - dateExpected.dateKey) as daysLate,
    count(distinct dateExcluded.dateKey) as daysToExclude
from 
    `warehouse.purchaseOrders` as purchaseOrders
    inner join `warehouse.dim_date` as dateExpected
        on date(purchaseOrders.orderExpectedDate) = dateExpected.fullDate
    inner join `warehouse.dim_date` as dateDelivered
        on date(purchaseOrders.orderDeliveredDate) = dateDelivered.fullDate
    left outer join `warehouse.dim_date` as dateExcluded
        on (     (dateExpected.dateKey < dateDelivered.dateKey
                        and dateExcluded.dateKey >= dateExpected.dateKey
                        and dateExcluded.dateKey < dateDelivered.dateKey)
                or (dateDelivered.dateKey < dateExpected.dateKey
                        and dateExcluded.dateKey >= dateDelivered.dateKey
                        and dateExcluded.dateKey < dateExpected.dateKey)
                )
        and (dateExcluded.isHoliday = 1 or dateExcluded.isWeekend = 1)

显然,表名称已经过更改,为简单起见,我们在此主要块上应用了各种条件来限制所考虑的采购订单的日期范围,并且除采购订单外,其他表的使用方式也非常相似,但是“ SQL的dateExcluded”位在许多报告中被广泛使用,因此我需要找出最佳方法来复制它!

预先感谢

0 个答案:

没有答案