【发布时间】:2021-09-23 11:50:03
【问题描述】:
我编写了一个函数来获取订单的净收入:
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-values 进行更新。我想要的是在下订单之前检查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`
非常感谢。
【问题讨论】:
标签: function google-bigquery correlated-subquery