如何解决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
ARRAY
时,为什么不同时丢弃它们呢?但是下面的代码不起作用。
CREATE OR REPLACE FUNCTION ch04.median (arr ANY TYPE) AS ((
SELECT IF(MOD(ARRAY_LENGTH(arr),2))] )
FROM (SELECT ARRAY_AGG(x ORDER BY x) AS arr FROM arr AS x)
));
SELECT
start_station_name,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
如您在上面的查询中所见,您已将已排序的数组提供给函数-因此可以删除函数中的所有排序内容
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。