【问题标题】:How to Unpivot a Struct in BigQuery?如何在 BigQuery 中取消透视结构?
【发布时间】:2021-11-08 07:37:09
【问题描述】:

我有一个带有 ID 的表,然后是一个结构。我想将结构的每个元素变成一个新行,结构字段名称是Period 列中的一个值,而该值是结构值。见下表

生成表的查询:

当前数据

我试过了:

    SELECT * FROM `business-analytics-workbench.RAW.User_Activity` as UA
    UNPIVOT(Activity FOR PERIOD in (Last_7_Days,Last_14_Days,Last_30_Days,Last_90_Days,First_Date_AEST,Last_Date_AEST))

但我收到此错误“无法识别的名称:Last_7_Days at [3:33]”

【问题讨论】:

    标签: sql google-cloud-platform google-bigquery unpivot


    【解决方案1】:

    您不能取消透视具有不同数据类型的列(在您的示例中,它们是 INT64 和 DATE)。所以考虑下面的方法

    SELECT * FROM (
      SELECT Document_ID, User_Activity.* 
      FROM `business-analytics-workbench.RAW.User_Activity` as UA
    )
    UNPIVOT(Activity FOR PERIOD in (Last_7_Days,Last_14_Days,Last_30_Days,Last_90_Days))    
    

    如果应用于 y 中的样本数据,我们的问题输出是

    【讨论】:

      【解决方案2】:

      如果您愿意在不使用 PIVOT 运算符的情况下进行数据透视表 - 在这种情况下您的限制较少 - 请考虑以下示例

      select Document_ID, split(kv, ':')[offset(0)] PERIOD, split(kv, ':')[offset(1)] Activit
      from (
        select Document_ID, User_Activity.* 
        from `business-analytics-workbench.RAW.User_Activity`
      ) t,
      unnest(split(translate(to_json_string(t), '{}"', ''))) kv
      where split(kv, ':')[offset(0)] != 'Document_ID'         
      

      如果应用于您问题中的样本数据 - 输出是

      【讨论】:

        【解决方案3】:

        由于这些是结构的一部分,请尝试使用完整的结构字段名称

        SELECT 
            * 
        FROM 
            `business-analytics-workbench.RAW.User_Activity` as UA
        UNPIVOT(
            Activity 
            FOR PERIOD in (
                User_Activity.Last_7_Days,
                User_Activity.Last_14_Days,
                User_Activity.Last_30_Days,
                User_Activity.Last_90_Days
            )
        )
        

        让我知道这是否适合你。

        【讨论】:

          猜你喜欢
          • 2015-03-06
          • 2020-03-14
          • 2014-12-04
          • 1970-01-01
          • 2021-11-05
          • 2014-10-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多