function - 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`
提前非常感谢。
解决方案
想象一下,您的order
表有 1M 行……您的函数将执行其查询 1M 次,每行一次,这太疯狂了。这是相关的子查询。当您将值硬编码到函数中时,它实际上只运行了 1 次。
考虑将您的“子查询”放入视图中,并包含要连接回order
表的列。
推荐阅读
- excel - 根据多个条件计算前 3 名产品的每日平均销售额
- r - 使用基因符号可视化 gseKEGG 结果
- reactjs - 无法设置反应项目
- android-studio - 为什么我的文本时钟视图不显示秒,只有分钟和小时
- php - 图像未在 Laravel 8 视图中显示
- angular - DOM 不使用 componentFactory 渲染
- reactjs - reactjs - 使用 xlsx 样式将数据导出到 xlsx 文件
- tomcat - HttpServletRequest#getParameter() 提取时间超过 10 秒
- pygame - 代码异常导致奇怪的俄罗斯方块生成动作
- python - NameError:未定义名称“OutOfBoundsDatetime”