繁体   English   中英

大查询中的数组

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM