我正在尝试通过对 key 进行重复数据删除来对扇形/重复的值求和。 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
最佳答案
以下适用于 BigQuery 标准 SQL
#standardSQL
CREATE TEMP FUNCTION SumDistinct(arr ANY TYPE) AS ((
SELECT AS STRUCT
COUNT(DISTINCT id) unique_ids,
SUM(val) total_value
FROM (
SELECT ANY_VALUE(t).*
FROM UNNEST(arr) t
GROUP BY FORMAT('%t', t)
)
));
SELECT SumDistinct(ARRAY_AGG(STRUCT(id, val))).*
FROM `project.dataset.data`
如果适用于您问题中的示例数据 - 结果是
Row unique_ids total_value
1 3 600
关于google-bigquery - BigQuery 中的 Sum Distinct by key(或对称聚合)函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58960009/