【问题标题】:Bigquery Standard Sql equivalent for GROUP_CONCAT_UNQUOTED from Legacy SqlBigquery Standard Sql 等效于 Legacy Sql 中的 GROUP_CONCAT_UNQUOTED
【发布时间】: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() 作为替代方案,但我没有得到所需的输出

【问题讨论】:

    标签: google-bigquery


    【解决方案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 中,我们使用 || 而不是 + 进行连接.你能给我指出一些定义它的链接吗?
    • 我们是否可以将列名作为参数传递,以便将查询用于多种用途,其中我可以将聚合键、透视键替换为其他列?
    • 通用答案 - 是的。但如果您需要编码方面的帮助 - 请发布包含所有相关详细信息的新问题,希望我们能够提供帮助:o)
    • 开始了新话题:link
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-12
    • 1970-01-01
    • 2017-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多