Bigquery Standard Sql 等效于 Legacy Sql 中的 GROUP_CONCAT_UNQUOTED
Posted
技术标签:
【中文标题】Bigquery Standard Sql 等效于 Legacy Sql 中的 GROUP_CONCAT_UNQUOTED【英文标题】:Bigquery Standard Sql equivalent for GROUP_CONCAT_UNQUOTED from Legacy Sql 【发布时间】:2020-06-24 12:34:46 【问题描述】:我目前正在使用 Bigquery 动态生成查询,使用“GROUP_CONCAT_UNQUOTED”函数将多个字符串连接为一个。
例子:
SELECT 'SELECT ID, AID, ' +
GROUP_CONCAT_UNQUOTED(
'MAX(IF(KEY = "' + KEY + '", VALUE, NULL)) as [' + KEY + ']'
)
+ ' FROM [project:dataset.tbl] GROUP BY 1,2 ORDER BY 1,2'
FROM (
SELECT KEY
FROM [project:dataset.tbl]
GROUP BY KEY
ORDER BY KEY
)
上面的查询产生另一个查询,如下所示:
SELECT
ID,
AID,
MAX(IF(KEY = "key1", VALUE, NULL)) as [key1],
MAX(IF(KEY = "key2", VALUE, NULL)) as [key2],
MAX(IF(KEY = "key3", VALUE, NULL)) as [key3]
FROM [project:dataset.tbl]
GROUP BY 1,2
ORDER BY 1,2
我想使用标准 SQL 而不是旧版 SQL 来做同样的事情。
Google 文档提到 STRING_AGG() 作为替代方案,但我没有得到所需的输出
【问题讨论】:
【参考方案1】:以下是 BigQuery 标准 SQL
#standardSQL
SELECT '''
SELECT ID, AID, ''' || (
SELECT STRING_AGG(DISTINCT "MAX(IF(key = '" || key || "', value, NULL)) AS " || key)
FROM `project.dataset.table`
) || '''
FROM `project.dataset.table`
GROUP BY 1,2
ORDER BY 1,2
'''
您也可以使用EXECUTE IMMEDIATE 一次性实际执行刚刚构建的查询
EXECUTE IMMEDIATE '''
SELECT ID, AID, ''' || (
SELECT STRING_AGG(DISTINCT "MAX(IF(key = '" || key || "', value, NULL)) AS " || key)
FROM `project.dataset.table`
) || '''
FROM `project.dataset.table`
GROUP BY 1,2
ORDER BY 1,2
'''
【讨论】:
它工作了.. 谢谢..在标准 Sql 中,我们使用 || 而不是 + 进行连接.你能给我指出一些定义它的链接吗? 当然。见Operators in Standard SQL 我们是否可以将列名作为参数传递,以便将查询用于多种用途,其中我可以将聚合键、透视键替换为其他列? 通用答案 - 是的。但如果您需要编码方面的帮助 - 请发布包含所有相关详细信息的新问题,希望我们能够提供帮助:o) 开始了新话题:link以上是关于Bigquery Standard Sql 等效于 Legacy Sql 中的 GROUP_CONCAT_UNQUOTED的主要内容,如果未能解决你的问题,请参考以下文章
什么 DataGrip SQL Dialect 最接近 BigQuery STANDARD SQL (SQL 2011)
使用外部 UDF 库运行 BigQuery Standard SQL
有没有办法在BigQuery Standard SQL中解析XML标签?
Bigquery (Standard Sql) - 年月日期格式