如何在 BigQuery 中反转结构?

How to Unpivot a Struct in BigQuery?

我有一个 table,它有一个 ID,然后是一个结构。我想将结构的每个元素变成一个新行,结构字段名称是列 Period 中的值,值是结构值。请参阅下面的 table

生成 table 的查询:

当前数据

我试过这个:

    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 在 [3:33]”

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

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
    )
)

让我知道这是否适合你。

您不能对具有不同数据类型的列进行逆透视(在您的示例中,它们是 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 中的样本数据,我们的问题输出是

如果您愿意在不使用 PIVOT 运算符的情况下转换 table - 在这种情况下您的限制较少 - 请考虑以下示例

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'         

如果应用于您问题中的示例数据 - 输出为