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) - 年月日期格式

PARSE_DATE : 解析函数 BigQuery/Standard SQL 的结果无效

有没有办法在 BigQuery Standard SQL 中解析 XML 标签?