[英]ARRAY in bigquery
CREATE OR REPLACE FUNCTION ch04.median (arr ANY TYPE) AS ((
SELECT IF(MOD(ARRAY_LENGTH(arr), 2) = 0,
( arr[OFFSET(DIV(ARRAY_LENGTH(arr), 2) - 1)] +
arr[OFFSET(DIV(ARRAY_LENGTH(arr), 2))]) / 2,
arr[OFFSET(DIV(ARRAY_LENGTH(arr), 2))] )
FROM (SELECT ARRAY_AGG(x ORDER BY x) AS arr FROM UNNEST(arr) AS x)
));
SELECT
start_station_name,
COUNT(*) AS num_trips,
ch04.median(ARRAY_AGG(tripduration)) AS typical_duration
FROM `bigquery-public-data`.new_york_citibike.citibike_trips
GROUP BY start_station_name
HAVING num_trips > 1000
ORDER BY typical_duration DESC
LIMIT 10
ch04只是我创建的一个随机数据集,它与纽约自行车数据集的位置相同
前面的代码工作正常。 但我注意到有FROM UNNEST(arr)
和ARRAY_AGG(tripduration)
,所以我认为当它们形成一个ARRAY
然后UNNEST
the ARRAY
时,为什么不同时放弃呢? 但是下面的代码不起作用。
CREATE OR REPLACE FUNCTION ch04.median (arr ANY TYPE) AS ((
SELECT IF(MOD(ARRAY_LENGTH(arr), 2) = 0,
( arr[OFFSET(DIV(ARRAY_LENGTH(arr), 2) - 1)] +
arr[OFFSET(DIV(ARRAY_LENGTH(arr), 2))]) / 2,
arr[OFFSET(DIV(ARRAY_LENGTH(arr), 2))] )
FROM (SELECT ARRAY_AGG(x ORDER BY x) AS arr FROM arr AS x)
));
SELECT
start_station_name,
COUNT(*) AS num_trips,
ch04.median(tripduration) AS typical_duration
FROM `bigquery-public-data`.new_york_citibike.citibike_trips
GROUP BY start_station_name
HAVING num_trips > 1000
ORDER BY typical_duration DESC
LIMIT 10
我收到此错误:
无效值:表名“arr”缺少数据集,而请求中未设置默认数据集。 在 [1:1]
谁能帮我解决这个问题? 非常感谢。
不幸的是,在这种特殊情况下,您无法避免使用 UNNEST ...
如果您真的想优化您的初始查询 - 以下是一个选项
CREATE OR REPLACE FUNCTION ch04.median (arr ANY TYPE) AS (
IF(MOD(ARRAY_LENGTH(arr), 2) = 0,
( arr[OFFSET(DIV(ARRAY_LENGTH(arr), 2) - 1)] +
arr[OFFSET(DIV(ARRAY_LENGTH(arr), 2))]) / 2,
arr[OFFSET(DIV(ARRAY_LENGTH(arr), 2))] )
);
SELECT
start_station_name,
COUNT(*) AS num_trips,
ch04.median(ARRAY_AGG(tripduration ORDER BY tripduration)) AS typical_duration
FROM `bigquery-public-data`.new_york_citibike.citibike_trips
GROUP BY start_station_name
HAVING num_trips > 1000
ORDER BY typical_duration DESC
LIMIT 10
正如您在上面的查询中看到的,您将已经订购的数组提供到您的 function - 所以 function 中的所有订购内容都可以删除
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.