如何将当前会话时间添加到 BigQuery 中的每个事件?
How to add current session time to each event in BigQuery?
我有一些看起来与此类似的数据:
我想添加一个包含每个事件发生的会话的开始时间的列,以便输出看起来像这样:
session_start_time
列基于 session_start
事件。
我试过在分析函数中使用分区,但要这样做,我需要每行中的值都相同才能开始,如果有,我就会解决我的问题。
我也试过 FIRST_VALUE
和 window 函数,但我没能只提取 event_name
是 "session_start" 的事件,因为我可以看不到在 window 函数内部进行过滤的方法。
如何在 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
#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
我有一些看起来与此类似的数据:
我想添加一个包含每个事件发生的会话的开始时间的列,以便输出看起来像这样:
session_start_time
列基于 session_start
事件。
我试过在分析函数中使用分区,但要这样做,我需要每行中的值都相同才能开始,如果有,我就会解决我的问题。
我也试过 FIRST_VALUE
和 window 函数,但我没能只提取 event_name
是 "session_start" 的事件,因为我可以看不到在 window 函数内部进行过滤的方法。
如何在 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
#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