Google bigquery “dataset.table”中的rray_agg(结构(id为id,val为val)))`

Google bigquery “dataset.table”中的rray_agg(结构(id为id,val为val)))`,google-bigquery,user-defined-functions,Google Bigquery,User Defined Functions,下面是针对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',

下面是针对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 

下面是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 

通常,自定义项按行/记录工作。因此
选择X,Y,udf\u添加(X,Y)作为Z
在每行的基础上工作。它不会将表中的所有
X
Y
值相加并进行聚合。您可以将值放入数组,将该数组传递给UDF,然后在UDF中的该数组上尝试您的逻辑。找到一个不同的查询模式(可能是CTE)来解决您的问题可能会更容易。您提供的示例非常自然地适合简单的SQL语句,但您为什么实际希望在UDF中实现这个查询模式呢?了解您的确切用例将有助于我们帮助您通常情况下,UDF是按行/记录工作的。因此
选择X,Y,udf\u添加(X,Y)作为Z
在每行的基础上工作。它不会将表中的所有
X
Y
值相加并进行聚合。您可以将值放入数组,将该数组传递给UDF,然后在UDF中的该数组上尝试您的逻辑。找到一个不同的查询模式(可能是CTE)来解决您的问题可能会更容易。您提供的示例非常自然地适合简单的SQL语句,但您为什么实际希望在UDF中实现这个查询模式呢?了解您的具体用例将有助于我们帮助您我通常会这样做,但我正在寻找一种可用于UDFI的解决方案我通常会这样做,但我正在寻找一种可用于UDF的解决方案
Row unique_ids  total_value  
1   3           600