SQL Unnest - 如何正确使用?

jbu*_*_13 4 sql presto unnest

假设我的表中有一些数据,t。

id, arr
--, ---
1,  [1,2,3]
2,  [4,5,6]
Run Code Online (Sandbox Code Playgroud)

SQL

SELECT AVG(n) FROM UNNEST(
    SELECT arr FROM t AS n) AS avg_arr 
Run Code Online (Sandbox Code Playgroud)

这会返回错误,'Mismatched input 'SELECT'. Expecting <expression>。取消数组嵌套并聚合未嵌套值的正确方法是什么?

Gur*_*ron 5

unnest通常与 a 一起使用join,并将数组扩展为关系(即对于数组的每个元素都会引入一行)。要计算平均值,您需要将值分组:

-- sample data
WITH dataset (id, arr) AS (
    VALUES (1,  array[1,2,3]),
        (2,  array[4,5,6])
) 

--query
select id, avg(n)
from dataset
cross join unnest (arr) t(n)
group by id
Run Code Online (Sandbox Code Playgroud)

输出:

ID _col1
1 2.0
2 5.0

但您也可以使用数组函数。取决于 presto 版本array_average

select id, array_average(n)
from dataset
Run Code Online (Sandbox Code Playgroud)

或者对于旧版本,通过手动聚合更麻烦的方法reduce

select id, reduce(arr, 0.0, (s, x) -> s + x, s -> s) / cardinality(arr)
from dataset
Run Code Online (Sandbox Code Playgroud)

  • @jbuddy_13 `t(n)` 是 `unnest(arr)` 结果的别名。由于“arr”是数组,因此它将扩展为单列(“n”) (2认同)