【问题标题】:How to create an array of structs containing aggregated data in BigQuery?如何在 BigQuery 中创建包含聚合数据的结构数组?
【发布时间】:2020-05-14 16:01:26
【问题描述】:

我在 Google BigQuery 中有一个包含来自 Firebase 的事件数据的表格,其中包含以下列:

event_date, event_timestamp, event_name, (etc..).

要按 event_name 计算事件数,我使用以下查询:

SELECT event_name, count(event_name) as event_count
FROM `analytics.events_20200510`
GROUP BY event_name;

导致:

我想将此结果转换为结构数组,格式为 JSON。示例:

{
    "events": [
        {"first_open": 69},
        {"screen_view": 510},
        {"user_engagement": 354},
        {"...": ..}
    ]
}

我开始了

SELECT TO_JSON_STRING(
STRUCT(
  ??? as events
), true)

但我被卡住了,不知道应该在 ??? 上进行什么操作才能使其正常工作。任何帮助将不胜感激。


编辑:

答案如下:

SELECT TO_JSON_STRING(
STRUCT(
  (SELECT ARRAY (SELECT AS STRUCT event_name, count(*) AS count FROM `analytics.events_20200510` GROUP BY event_name)) AS events
), true);

结果

{
  "events": [
    {
      "event_name": "session_start",
      "count": 69
    },
    {
      "event_name": "screen_view",
      "count": 510
    },
    (...)
  ]
}

这几乎是正确的,但我希望事件名称是“键”,而计数是结构中的“值”(如我的 JSON 示例中所示)。这可能吗?

【问题讨论】:

  • 请提供样本数据和期望的结果。我也无法判断您的问题是什么——计算值(未定义)或构造为 JSON。
  • @GordonLinoff 我更新了问题,希望现在清楚

标签: sql google-bigquery


【解决方案1】:

以下是 BigQuery 标准 SQL

#standardSQL
SELECT '{"events": [' || STRING_AGG(events) || ']}' AS json
FROM (
  SELECT FORMAT('{"%s": %i}', event_name, COUNT(event_name)) AS events
  FROM `analytics.events_20200510`
  GROUP BY event_name
)

如果您要针对与您的问题相同的数据运行它 - 结果将是

Row json     
1   {"events": [{"session_start": 69},{"screen_view": 510},{"user_engahement": 354}]}   

【讨论】:

    【解决方案2】:

    这应该可以工作

    with data as (
      select 'event_type1' as event_type
      union all
      select 'event_type2' as event_type
      union all
      select 'event_type3' as event_type
      union all
      select 'event_type1' as event_type
      union all
      select 'event_type2' as event_type
      union all
      select 'event_type1' as event_type
    ) 
    select TO_JSON_STRING(t) from (
    SELECT  array (
    select as struct count(*) as event_count, event_type from data group by event_type
    ) as events
    ) t;
    

    输出

    {"events":[{"event_count":3,"event_type":"event_type1"},{"event_count":2,"event_type":"event_type2"},{"event_count":1,"event_type":"event_type3"}]}
    

    【讨论】:

    • 感谢您的回答。然而,格式与我的 JSON 示例不同。是不是可以在结构体中 event_name 作为键,事件计数作为值?
    猜你喜欢
    • 1970-01-01
    • 2018-09-29
    • 2021-07-26
    • 1970-01-01
    • 2022-01-22
    • 2019-11-02
    • 1970-01-01
    • 1970-01-01
    • 2017-04-25
    相关资源
    最近更新 更多