簡體   English   中英

BigQuery 如何根據重疊間隔連接 2 個表?

[英]BigQuery how to join 2 tables based on overlapping intervals?

我需要將此連接從 Postgres 轉換為 BigQuery:

-- postgres
SELECT *
FROM table_a
INNER JOIN table_b
ON tstzrange(table_a.start, table_a.end) && tstzrange(table_b.start, table_b.end)

我已經嘗試了 4 個重疊的案例,但在 BigQuery 中它不是那樣工作的。 我的結果總是缺少一些 windows。

INNER JOIN table_b
ON 
-- case 1
a.start <= b.start AND b.end <= a.end
OR
-- case 2
a.start <= b.start AND b.start <= a.end
OR 
-- case 3
b.start <= a.start AND a.end <= b.end
OR
-- case 4
b.start <= a.start AND a.start <= b.end

考慮以下條件以檢查是否存在重疊期。

  • a.start <= b.end AND b.start <= a.end

示例查詢是

WITH table_a AS (
  SELECT TIMESTAMP '2023-01-01 09:00:00' start, TIMESTAMP '2023-01-10 09:00:00' `end` UNION ALL
  SELECT '2023-01-05 09:00:00' start, '2023-01-15 09:00:00' `end` 
),
table_b AS (
  SELECT TIMESTAMP '2022-12-15 09:00:00' start, TIMESTAMP '2023-01-04 09:00:00' `end` UNION ALL 
  SELECT '2023-01-12 09:00:00' start, '2023-01-20 09:00:00' `end`
)
SELECT * FROM table_a a JOIN table_b b ON a.start <= b.end AND b.start <= a.end;

查詢結果

在此處輸入圖像描述

問題是 NULL 值在 Postgres tstzrange中自動處理為下限和上限。 它不在基本查詢或 BQ 中處理。 使用COALESCE()解決了這個問題。

暫無
暫無

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

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