首页 > 解决方案 > Google BigQuery:函数中的“相关子查询”错误

问题描述

我编写了一个函数来获取订单的净收入:

CREATE OR REPLACE FUNCTION
  `project.dataset.function`(inputBuyerCurrency STRING,
    inputCountryCode STRING,
    inputPrice FLOAT64,
    inputOrderTimestamp TIMESTAMP)
  RETURNS FLOAT64 AS ( (
    SELECT
      P
    FROM (
      SELECT
        AVG(APP.Proceeds) AS P,
        App.InsertedTimestamp
      FROM
        `project.dataset.lookup` APP
      LEFT JOIN
        `project.dataset.countrycode_lookup` CC
      ON
        APP.Region = CC.Alpha3
      WHERE
        CC.Alpha2 = inputCountryCode
        AND App.Currency = inputBuyerCurrency
        AND App.Price = inputPrice / 100
        AND App.InsertedTimestamp <= inputOrderTimestamp
      GROUP BY
        App.InsertedTimestamp
      ORDER BY
        InsertedTimestamp DESC
      LIMIT
        1)) );

参数是不言自明的;下订单时使用的货币、买家所在的国家/地区、价格和下订单的时间戳。

project.dataset.lookup-table 每天都会使用新的 NetRevenue 值进行更新。我想要的是在下project.dataset.lookup订单之前检查哪一行是最后一个匹配的行。因此,2021-01-01 22:00:00(例如)的订单应与 InsertTimestamp 为 2021-01-01 01:00:00 的内容匹配。

当我使用硬编码值“调用”该函数时,不会出现任何问题。我得到了我想要的结果。但是,当我尝试使用表中的值调用函数时,我收到以下错误:不支持引用其他表的相关子查询,除非它们可以去相关,例如通过将它们转换为有效的 JOIN。.

所以,这有效:

SELECT `project.dataset.function`("EUR", "NL", 1999, 1626269392)

但这不会:

SELECT `project.dataset.function`(CurrencyCode, CountryCode, Price, Timestamp)
FROM `project.dataset.order`

提前非常感谢。

标签: functiongoogle-bigquerycorrelated-subquery

解决方案


想象一下,您的order表有 1M 行……您的函数将执行其查询 1M 次,每行一次,这太疯狂了。这是相关的子查询。当您将值硬编码到函数中时,它实际上只运行了 1 次。

考虑将您的“子查询”放入视图中,并包含要连接回order表的列。


推荐阅读