繁体   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