bigquery_etl/glam/templates/clients_scalar_aggregates_v1.udf.sql (70 lines of code) (raw):
{# Accepts: user_data_type, user_data_attributes #}
CREATE TEMP FUNCTION udf_merged_user_data(aggs {{ user_data_type }})
RETURNS {{ user_data_type }} AS (
(
WITH unnested AS (
SELECT
*
FROM
UNNEST(aggs)
WHERE
agg_type != "avg"
),
aggregated AS (
SELECT
{{ user_data_attributes }},
agg_type,
--format:off
CASE agg_type
WHEN 'max' THEN max(value)
WHEN 'min' THEN min(value)
WHEN 'count' THEN sum(value)
WHEN 'sum' THEN sum(value)
WHEN 'false' THEN sum(value)
WHEN 'true' THEN sum(value)
END AS value
--format:on
FROM
unnested
WHERE
value IS NOT NULL
GROUP BY
{{ user_data_attributes }},
agg_type
),
scalar_count_and_sum AS (
SELECT
{{ user_data_attributes }},
'avg' AS agg_type,
--format:off
CASE WHEN agg_type = 'count' THEN value ELSE 0 END AS count,
CASE WHEN agg_type = 'sum' THEN value ELSE 0 END AS sum
--format:on
FROM
aggregated
WHERE
agg_type IN ('sum', 'count')
),
scalar_averages AS (
SELECT
* EXCEPT (count, sum),
SUM(sum) / SUM(count) AS agg_value
FROM
scalar_count_and_sum
GROUP BY
{{ user_data_attributes }},
agg_type
),
merged_data AS (
SELECT
*
FROM
aggregated
UNION ALL
SELECT
*
FROM
scalar_averages
)
SELECT
ARRAY_AGG(({{ user_data_attributes }}, agg_type, value))
FROM
merged_data
)
);