簡體   English   中英

如何對不平等做左外部聯接?

[英]How to do a left outer join on inequality?

我在BigQuery上有以下SQL查詢。 我正在嘗試加入兩個不同的表,其中一個表比另一個小得多。 最初,我使用了常規聯接,但這會消除一些正在使用的數據。

with weekly_periods as(
select
    ticket_id,
    start_time_in_minutes_from_week,
    raw_delta_in_minutes,
    week_number,
    greatest(0, start_time_in_minutes_from_week - week_number * (7 * 24 * 60)) as ticket_week_start_time,
    least(start_time_in_minutes_from_week + raw_delta_in_minutes - week_number * (7 * 24 * 60),(7 * 24 * 60)) as ticket_week_end_time
from
    ticket_solved_time,
    unnest(generate_array(0, floor((start_time_in_minutes_from_week + raw_delta_in_minutes) / (7 * 24 * 60)), 1)) as week_number,
    intercepted_periods as(
        select
            ticket_id,
            week_number,
            ticket_week_start_time,
            ticket_week_end_time,
            schedule.start_time as schedule_start_time,
            schedule.end_time as schedule_end_time,
            least(ticket_week_end_time, schedule.end_time) - greatest(ticket_week_start_time, schedule.start_time) as scheduled_minutes
        from
            weekly_periods
            left join
                schedule
            on  ticket_week_start_time <= schedule.end_time
            and ticket_week_end_time >= schedule.start_time

但是我收到以下錯誤:-如果沒有連接兩面的字段相等的條件,則無法使用LEFT OUTER JOIN-

在保留數據的同時如何進行聯接? 如果我只是做JOIN查詢不會返回完整的結果。 謝謝!

您需要做的是使用交叉聯接,然后在where子句中添加聯接條件,如下所示:

with weekly_periods as(
select
    ticket_id,
    start_time_in_minutes_from_week,
    raw_delta_in_minutes,
    week_number,
    greatest(0, start_time_in_minutes_from_week - week_number * (7 * 24 * 60)) as ticket_week_start_time,
    least(start_time_in_minutes_from_week + raw_delta_in_minutes - week_number * (7 * 24 * 60),(7 * 24 * 60)) as ticket_week_end_time
from
    ticket_solved_time,
    unnest(generate_array(0, floor((start_time_in_minutes_from_week + raw_delta_in_minutes) / (7 * 24 * 60)), 1)) as week_number,
    intercepted_periods as(
        select
            ticket_id,
            week_number,
            ticket_week_start_time,
            ticket_week_end_time,
            schedule.start_time as schedule_start_time,
            schedule.end_time as schedule_end_time,
            least(ticket_week_end_time, schedule.end_time) - greatest(ticket_week_start_time, schedule.start_time) as scheduled_minutes
        from
            weekly_periods
            Cross join
                schedule
            Where  ticket_week_start_time <= schedule.end_time
            and ticket_week_end_time >= schedule.start_time

您需要使用=運算符(以下示例)基於關系鍵聯接表,然后使用where實現您的條件...由於您沒有發布表結構,因此這只是聯接方法正確的一個示例

    left join
    schedule
    on  schedule.id = weekly_period.ticketid and 
        weekly_period.ticketid = intercepted_period.ticketid
    where
        ticket_week_start_time <= schedule.end_time
    and ticket_week_end_time >= schedule.start_time

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM