[英]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.