[英]How to count the frequency of words from table column GoogleSQL Bigquery
[英]How to convert an array of key values to columns in BigQuery / GoogleSQL?
我在 BigQuery 中有一个如下所示的数组:
SELECT params FROM mySource;
[
{
key: "name",
value: "apple"
},{
key: "color",
value: "red"
},{
key: "delicious",
value: "yes"
}
]
看起来像这样:
参数 |
---|
[{ key: "name", value: "apple" },{ key: "color", value: "red" },{ key: "delicious", value: "yes" }] |
如何更改我的查询,使表看起来像这样:
姓名 | 颜色 | 美味的 |
---|---|---|
苹果 | 红色的 | 是的 |
目前我能够通过以下方式完成此任务:
SELECT
(
SELECT p.value
FROM UNNEST(params) AS p
WHERE p.key = "name"
) as name,
(
SELECT p.value
FROM UNNEST(params) AS p
WHERE p.key = "color"
) as color,
(
SELECT p.value
FROM UNNEST(params) AS p
WHERE p.key = "delicious"
) as delicious,
FROM mySource;
但我想知道是否有一种方法可以在不手动指定每个键名的情况下做到这一点。 我们可能无法提前知道所有键的名称。
谢谢!
考虑以下方法
select * except(id) from (
select to_json_string(t) id, param.*
from mySource t, unnest(parameters) param
)
pivot (min(value) for key in ('name', 'color', 'delicious'))
如果应用于您问题中的样本数据 - 输出如下
如您所见 - 您仍然需要指定键名,但整个查询更简单且更易于管理
同时,上面的查询可以通过使用 EXECUTE IMMEDIATE 来增强,其中键名列表是自动生成的。 我对这种技术至少有几个答案,所以如果你愿意,可以在 SO 上搜索它(我只是不想在这里复制)
这是基于我试穿米哈伊尔的答案在这里
--DDL for sample view
create or replace view sample.sampleview
as
with _data
as
(
select 1 as id,
array (
select struct(
"name" as key,
"apple" as value
)
union all
select struct(
"color" as key,
"red" as value
)
union all
select struct(
"delicious" as key,
"yes" as value
)
) as _arr
union all
select 2 as id,
array (
select struct(
"name" as key,
"orange" as value
)
union all
select struct(
"color" as key,
"orange" as value
)
union all
select struct(
"delicious" as key,
"yes" as value
)
)
)
select * from _data
立即执行
declare sql string;
set sql =
(
select
concat(
"select id,",
string_agg(
concat("max(if (key = '",key,"',value,NULL)) as ",key)
),
' from sample.sampleview,unnest(_arr) group by id'
)
from (
select key from
sample.sampleview,unnest(_arr)
group by key
)
);
execute immediate sql;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.