【问题标题】:How can I generate json string with group_concat in bigquery?如何在 bigquery 中使用 group_concat 生成 json 字符串?
【发布时间】:2017-12-15 03:53:57
【问题描述】:

我有一张桌子:

user   device   minutes
====   ======   =======
ben    phone    1.9
ben    tablet   2.3
anna   phone    1.6

我想将设备使用打包成一个json字符串,用户喜欢:

user   json
====   =====
ben    {"phone":1.9, "tablet":2.3}
anna   {"phone":1.6, "tablet":2.3}

如何在 bigquery 中执行此操作?

【问题讨论】:

    标签: json google-bigquery


    【解决方案1】:

    以下是 BigQuery 标准 SQL 的版本

    #standardSQL
    WITH `yourproject.yourdataset.yourtable` AS (
      SELECT 'ben' user, 'phone' device, 1.9 minutes UNION ALL
      SELECT 'ben', 'tablet', 2.3 UNION ALL
      SELECT 'anna', 'phone', 1.6 
    )
    SELECT 
      user, 
      CONCAT('{', STRING_AGG(CONCAT('"',device, '":', CAST(minutes AS STRING))), '}') json,
      ROUND(SUM(IF(device='tablet',minutes,0)),2) tablet_minutes
    FROM `yourproject.yourdataset.yourtable`
    GROUP BY user 
    

    输出如下

    user    json                        tablet_minutes   
    ben     {"phone":1.9,"tablet":2.3}  2.3  
    anna    {"phone":1.6}               0.0  
    

    【讨论】:

      【解决方案2】:

      使用 BigQuery 旧版 SQL

      # legacySQL
      SELECT
        user,
        json,
        JSON_EXTRACT_SCALAR(json, '$.tablet') AS tablet_minutes
      FROM (
        SELECT
          user,
          CONCAT('{', GROUP_CONCAT_UNQUOTED(CONCAT('"', device,'":', minutes)), '}') AS json,
        FROM 
          (SELECT 'ben' user, 'phone' device, '1.9' minutes),
          (SELECT 'ben' user, 'tablet' device, '2.3' minutes),
          (SELECT 'anna' user, 'phone' device, '1.6' minutes),
        GROUP BY
          user)
      

      使用标准 SQL(感谢 Mikhail)

      # standardSQL
      WITH `yourproject.yourdataset.yourtable` AS (
        SELECT 'ben' user, 'phone' device, 1.9 minutes UNION ALL
        SELECT 'ben', 'tablet', 2.3 UNION ALL
        SELECT 'anna', 'phone', 1.6 
      )
      SELECT 
        user, 
        CONCAT('{', STRING_AGG(CONCAT('"',device, '":', CAST(minutes AS STRING))), '}') json,
        ROUND(SUM(IF(device='tablet',minutes,0)),2) tablet_minutes
      FROM `yourproject.yourdataset.yourtable`
      GROUP BY user 
      

      两个输出

      user    json                        tablet_minutes
      ====    ====                        ==============   
      ben     {"phone":1.9,"tablet":2.3}  2.3  
      anna    {"phone":1.6}               0.0  
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-27
        • 1970-01-01
        • 2022-10-23
        • 1970-01-01
        • 2022-11-24
        • 1970-01-01
        • 1970-01-01
        • 2019-11-01
        相关资源
        最近更新 更多