-
Notifications
You must be signed in to change notification settings - Fork 10
Open
Description
sql
CREATE
[ OR REPLACE ]
[ { TEMPORARY | TEMP } ]
AGGREGATE FUNCTION
[ IF NOT EXISTS ]
function_path ( [ function_parameter[, ...] ] )
[ RETURNS data_type ]
AS ( sql_function_body )
[ OPTIONS ( [function_option_list](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#function_option_list) ) ]
function_path:
[[project_name.]dataset_name.]function_name
function_parameter:
parameter_name
data_type
[ NOT AGGREGATE ]example
CREATE AGGREGATE FUNCTION myProject.myDataset.ScaledSum(
dividend FLOAT64,
divisor FLOAT64 NOT AGGREGATE)
RETURNS FLOAT64
AS (
SUM(dividend) / divisor
);
-- Call the SQL UDAF.
SELECT ScaledSum(col1, 2) AS scaled_sum
FROM (
SELECT 1 AS col1 UNION ALL
SELECT 3 AS col1 UNION ALL
SELECT 5 AS col1
);
/*------------*
| scaled_sum |
+------------+
| 4.5 |
*------------*/javascript
CREATE
[ OR REPLACE ]
[ { TEMPORARY | TEMP } ]
AGGREGATE FUNCTION
[ IF NOT EXISTS ]
function_path([ function_parameter[, ...] ])
RETURNS return_data_type
LANGUAGE js
[ OPTIONS ( [function_option_list](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#javascript-udaf-function-option-list) ) ]
AS function_body
function_path:
[[project_name.]dataset_name.]function_name
function_parameter:
parameter_name parameter_data_type [ NOT AGGREGATE ]
CREATE TEMP AGGREGATE FUNCTION SumPositive(x FLOAT64)
RETURNS FLOAT64
LANGUAGE js
AS r'''
export function initialState() {
return {sum: 0}
}
export function aggregate(state, x) {
if (x > 0) {
state.sum += x;
}
}
export function merge(state, partialState) {
state.sum += partialState.sum;
}
export function finalize(state) {
return state.sum;
}
''';
-- Call the JavaScript UDAF.
WITH numbers AS (
SELECT * FROM UNNEST([1.0, -1.0, 3.0, -3.0, 5.0, -5.0]) AS x)
SELECT SumPositive(x) AS sum
FROM numbers;
/*-----*
| sum |
+-----+
| 9.0 |
*-----*/Metadata
Metadata
Assignees
Labels
No labels