【问题标题】:BigQuery and Google Analytics SQL queryBigQuery 和 Google Analytics SQL 查询
【发布时间】:2021-02-26 05:49:28
【问题描述】:

我正在尝试从从 Google Analytics(分析)数据导入 BigQuery 的表中构建一个矩阵。该表表示网站上的点击,其中包含 session_ID 以及一些属性,例如 url、时间戳等。此外,还有一些基于用户定义操作的元数据,我们将其称为事件。下面是一个表格示例。

session_id  hit_timestamp   url event_category
1           11:12:23        url134      event1
1           11:14:23        url2234     event2
1           11:16:23        url_target  null
2           03:12:11        url2344     event1
2           03:14:11        url43245    event2
3           09:10:11        url5533     event2
3           09:09:11        url_target  null
4           08:08:08        url64356    event2
4           08:09:08        url56456    event2
4           08:10:08        url_target  null

预期的结果应该类似于下表。

session_id  event1  event2  target
1           1       1       1
2           0       0       0
3           0       0       0
4           0       2       1

请注意,任何不导致 url_target 的事件都应表示为零,包括目标。这意味着查询应该查看时间戳以通过查看它们的时间戳来检查任何事件是否跟在 url_target 之后。例如,event2 后面没有“url_target”,这就是我们将其表示为零的原因。 session_id 3 中的情况相同,因为 event2 后面没有 url_target,请注意 url_target 的时间戳在 event2 之前,而不是在它之后。因此用零表示。

如果在构建 SQL 查询以生成该矩阵方面提供任何帮助,我将不胜感激。我只能按 session_id 分组,然后使用“count”执行计数事件,但无法找到写入 SQL 查询以匹配时间戳并检查其他字段。

【问题讨论】:

  • 您只有两个或更多活动吗?如果更多 - 它们的数量和名称是静态的还是动态的?你可以在同一个会话中有多个 url_target 吗?

标签: sql datetime count google-bigquery pivot


【解决方案1】:

考虑:

select session_id,
    countif(cnt_url_target > 0 and event_category = 'event1') event1,
    countif(cnt_url_target > 0 and event_category = 'event2') event2,
    countif(url = 'url_target') target
from (
    select t.*,
        countif(url = 'url_target') over(partition by session_id order by hit_timestamp desc) cnt_url_target
    from mytable t
) t
group by session_id

【讨论】:

    【解决方案2】:

    使用子查询计算第一个(或最后一个)目标时间。然后使用countif() 和聚合:

    select session_id,
           countif(target_hit_timestamp > hit_timestamp and category = 'event1') as event1,
           countif(target_hit_timestamp > hit_timestamp and category = 'event2') as event2,
           countif(url like '%target') as target
    from (select t.*,
                 min(case when url like '%target' then hit_timestamp end) over (partition by session_id) as target_hit_timestamp
          from t
         ) t
    group by session_id
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-24
      • 2018-08-10
      相关资源
      最近更新 更多