簡體   English   中英

Bigquery:使用來自子查詢外部的列的 WHERE 子句

[英]Bigquery: WHERE clause using column from outside the subquery

Bigquery 的新手,谷歌搜索無法真正指出問題的解決方案。

我正在嘗試在子查詢中使用 where 子句來過濾並選擇主查詢中每一行的最新行。 在 postgres 中,我通常會這樣做:

SELECT
    *
FROM
    table_a AS a
    LEFT JOIN LATERAL
    (
        SELECT
            score,
            CONCAT( "AB", id ) AS id 
        FROM
            table_b AS b
        WHERE
            id = a.company_id
            and 
            b.date < a.date
        ORDER BY
            b.date DESC 
        LIMIT
            1
    ) ON true

WHERE
    id LIKE 'AB%'

ORDER BY
    createdAt DESC

所以這實際上將針對每一行運行子查詢,並根據表 A 中給定行的日期從表 B 中選擇最新行。

所以如果表A會有一行

ID 日期
12 2021-05-XX

和表B

ID 日期 價值
12 2022-01-XX 99
12 2021-02-XX 98
12 2020-03-XX 97
12 2019-04-XX 96

它只會將帶有2021-02-XX的行加入到表a中。


在另一個例子中,與

A

ID 日期
15 2021-01-XX

B

ID 日期 價值
15 2022-01-XX 99
15 2021-02-XX 98
15 2020-03-XX 97
15 2019-04-XX 96

它只會加入date: 2020-03-XX, value: 97的行。

希望這很清楚,不太確定如何編寫此查詢來工作

感謝幫助!

您可以使用簡單的聯接和限定語句替換一些相關的子選擇邏輯。

嘗試以下操作:

SELECT *
FROM table_a a
LEFT JOIN table_b b
  ON a.id = b.id
WHERE b.date < a.date
QUALIFY ROW_NUMBER() OVER (PARTITION BY b.id ORDER BY b.date desc) = 1

使用您的示例數據,它會產生: 在此處輸入圖像描述

這應該適用於截斷日期 (YYYY-MM) 以及完整日期 (YYYY-MM-DD)

像下面這樣的東西應該可以滿足您的要求

    WITH
  latest_record AS (
  SELECT
    a.id,
    value,b.date, a.createdAt
  FROM
    `gcp-project-name.data-set-name.A` AS a
  JOIN
    `gcp-project-name.data-set-name.B` b
  ON
    ( a.id = b.id
      AND b.date < a.updatedAt )
  ORDER BY
    b.date DESC
  LIMIT
    1 )
SELECT
  *
FROM
  latest_record

我用表 A 運行這個

在此處輸入圖像描述

和表 B 為

在此處輸入圖像描述

並得到結果

在此處輸入圖像描述

暫無
暫無

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

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