如何在BigQuery中为每个事件添加当前会话时间?

时间:2018-06-18 02:13:08

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

我有一些看起来类似的数据:

input data

我想添加一个列,其中包含每个事件发生的会话的开始时间,以便输出看起来像这样:

desired output data

session_start_time列基于session_start事件。

我已尝试在分析函数中使用分区但是为了这样做,我需要在每行中使用相同的值,如果我有,我会解决我的问题。

我还尝试使用窗口函数FIRST_VALUE,但我还没有设法只提取event_name为“session_start”的事件,因为我看不到内部过滤的方法窗函数。

如何在BigQuery上使用标准SQL实现这一目标?

以下是包含示例数据的示例查询:

WITH user_events AS (
  SELECT
    1 AS user_id,
    'session_start' AS event_name,
    0 AS event_time
  UNION ALL SELECT 1, 'video_play', 2
  UNION ALL SELECT 1, 'ecommerce_purchase', 3
  UNION ALL SELECT 1, 'session_start', 100
  UNION ALL SELECT 1, 'video_play', 105
)

SELECT
  user_id,
  event_name,
  event_time
FROM
  user_events
ORDER BY
  event_time

1 个答案:

答案 0 :(得分:1)

#standardSQL
WITH user_events AS (
  SELECT 1 AS user_id, 'session_start' AS event_name, 0 AS event_time UNION ALL 
  SELECT 1, 'video_play', 2 UNION ALL 
  SELECT 1, 'ecommerce_purchase', 3 UNION ALL 
  SELECT 1, 'session_start', 100 UNION ALL 
  SELECT 1, 'video_play', 105
)
SELECT 
  user_id,
  event_name,
  event_time,
  MIN(event_time) OVER(PARTITION BY user_id, session) AS session_start_time
FROM (
  SELECT
    user_id,
    event_name,
    event_time,
    COUNTIF(event_name='session_start') OVER(PARTITION BY user_id ORDER BY event_time) AS session
  FROM user_events
)
ORDER BY event_time