我写了一个函数来获取订单的净收入:
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
-表每天都会使用新的NetRevenue值进行更新。我想要的是检查在下订单之前project.dataset.lookup
中最后一个匹配的行是哪一行。因此,2021-01-01 22:00:00的顺序(例如(应该与InsertTimestamp为2021-01-001: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
表的列。