【发布时间】:2019-11-20 17:19:01
【问题描述】:
我正在尝试通过对它们的键进行重复数据删除来对扇形/重复值求和。 Looker 将此称为对称聚合。我想使用持久的 UDF 而不是依赖子查询。 Looker 有一个非常优雅的解决方案,似乎可以将其烘焙到 UDF 中。
我试过了:
CREATE OR REPLACE FUNCTION `fn.sumdistinct`(unique_key ANY TYPE, val_to_sum ANY TYPE) AS (
COALESCE(ROUND(COALESCE(CAST((SUM(DISTINCT (CAST(ROUND(COALESCE(safe_cast(val_to_sum as float64) ,0)*(1/1000*1.0), 9) AS NUMERIC) + (cast(cast(concat('0x', substr(to_hex(md5(CAST(unique_key AS STRING))), 1, 15)) as int64) as numeric) * 4294967296 + cast(cast(concat('0x', substr(to_hex(md5(CAST(unique_key AS STRING))), 16, 8)) as int64) as numeric)) * 0.000000001 )) - SUM(DISTINCT (cast(cast(concat('0x', substr(to_hex(md5(CAST(unique_key AS STRING))), 1, 15)) as int64) as numeric) * 4294967296 + cast(cast(concat('0x', substr(to_hex(md5(CAST(unique_key AS STRING))), 16, 8)) as int64) as numeric)) * 0.000000001) ) / (1/1000*1.0) AS FLOAT64), 0), 6), 0)
);
但我明白了:
Invalid function fn.sumdistinct. Aggregate function SUM not allowed in templated SQL function call
我在找一个可以转这个的函数:
id val
1 100
2 200
2 200
3 300
3 300
3 300
进入:
unique_ids total_value
3 600
【问题讨论】:
-
通常,UDF 以每行/记录为基础工作。所以
select X, Y, udf_add(X,Y) as Z在每行的基础上工作。它不会将表中的所有X和Y值加起来并聚合。您可以将您的值放入一个数组中,将该数组传递给一个 UDF,然后在 UDF 中对该数组尝试您的逻辑。找到解决您问题的不同查询模式(可能是 CTE)可能会更容易。 -
您为什么实际寻找在 UDF 中实现此功能的任何上下文,而您提供的示例如此自然地适合简单的 SQL 语句?了解您的确切用例将有助于我们为您提供帮助
标签: google-bigquery user-defined-functions