Как написать левое соединение BigQuery без условия равенства - PullRequest
0 голосов
/ 17 июня 2020

Я перемещаю нагрузку кода из MySQL в BigQuery, и ряд наших текущих отчетов ссылается на измерение даты, чтобы подсчитать количество выходных и праздничных дней между началом и концом. Я просмотрел много других ответов здесь, и основное предложение, похоже, заключается в использовании перекрестного соединения, но я потратил полдня или около того, играя с разными способами сделать это, и просто не могу это сделать. работать из-за логи c примерно в разные даты? Я поместил основной фрагмент кода ниже - может ли кто-нибудь предложить лучший способ перенести его на 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)

Очевидно, имена таблиц были изменены для простоты, и мы применяем различные условия к этому основному блоку, чтобы ограничить диапазон дат рассматриваемых заказов на покупку, и это также используется очень похожим образом для таблиц, отличных от заказов на покупку, но бит «dateExcluded» SQL широко используется во многих отчетах, поэтому мне нужно найти лучший способ воспроизвести это!

Спасибо заранее

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...