SQL Unnest-如何正确使用?
SQL Unnest- how to use correctly?
假设我在 table 中有一些数据,t.
id, arr
--, ---
1, [1,2,3]
2, [4,5,6]
SQL
SELECT AVG(n) FROM UNNEST(
SELECT arr FROM t AS n) AS avg_arr
这个returns错误,'Mismatched input 'SELECT'. Expecting <expression>
。
取消嵌套数组并聚合未嵌套值的正确方法是什么?
unnest
通常与 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
输出:
id
_col1
1
2.0
2
5.0
但您也可以使用 array functions。取决于 presto 版本 array_average
:
select id, array_average(n)
from dataset
或者对于旧版本,通过 reduce
:
手动聚合的更麻烦的方法
select id, reduce(arr, 0.0, (s, x) -> s + x, s -> s) / cardinality(arr)
from dataset
假设我在 table 中有一些数据,t.
id, arr
--, ---
1, [1,2,3]
2, [4,5,6]
SQL
SELECT AVG(n) FROM UNNEST(
SELECT arr FROM t AS n) AS avg_arr
这个returns错误,'Mismatched input 'SELECT'. Expecting <expression>
。
取消嵌套数组并聚合未嵌套值的正确方法是什么?
unnest
通常与 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
输出:
id | _col1 |
---|---|
1 | 2.0 |
2 | 5.0 |
但您也可以使用 array functions。取决于 presto 版本 array_average
:
select id, array_average(n)
from dataset
或者对于旧版本,通过 reduce
:
select id, reduce(arr, 0.0, (s, x) -> s + x, s -> s) / cardinality(arr)
from dataset