事件分析:如何使用SQL定义用户会话
许多“开箱即用”的分析解决方案都带有自动定义的用户会话。最好从开始做起,但是随着公司的发展,您将希望根据事件数据拥有自己的会话定义。使用SQL分析用户会话可为您提供灵活性并完全控制如何为您的独特业务定义指标。
什么是会议,我为什么要关心?
会话通常被定义为 一组用户在给定时间范围内在您的应用上执行的互动。通常,该时间范围默认为30分钟。一个会话包括用户离开前在您的应用上完成的所有事件,例如,访问页面,下载资料,执行操作。
用户会话
会议到位后,我们将能够回答以下问题:
用户花了多少时间在该应用上?
跳出率是多少?
应用程序最常使用的区域是什么?
进行目标操作的用户来自哪里?
用户大部分时间都花在哪里?
定义用户会话权限
要定义用户会话,我们需要在数据库中 至少包含一个user_id 和 timestamp的事件表。
通常,事件表中会包含很多其他信息,例如事件类型,名称,设备信息,引荐来源网址等等。所有这些属性对于为我们的会话提供更多上下文并构建事物(例如归因模型)将非常有用。
注意:在本文中,我们将使用窗口函数,因此以下示例不适用于MySQL。同样,所有这些查询都专用于Redshift数据库。
步骤1
使用SQL定义用户会话的第一步是通过 user_id找出当前行的时间戳和上一行的时间戳之间的差异。我们将使用LAG函数来完成它。 这将使我们在事件之间没有活动时间。
SELECT
*
,DATEDIFF(分钟,滞后(时间戳)超过(PARTITION BY user_id按时间戳排序),时间戳)作为inactivity_time
FROM事件
第一个事件的inactivity_time 为NULL,因为它是第一个事件,并且我们之前没有任何内容。
第2步
我们可以使用 inactivity_time 根据30分钟的不活动间隔将事件分组为会话。首先,我们将选择nactivity_time 为NULL或超过30分钟的所有事件,这意味着它是会话中的第一个事件。
基于第一个事件,我们定义 session_start_at,这是第一个事件的时间戳。我们使用ROW_NUMBER函数来 计算会话顺序,该顺序在 session_id中使用。
SELECT
event.user_id || '-'|| ROW_NUMBER()以上(分区由event.user_id为了通过event.timestamp)如SESSION_ID
,event.user_id
,event.timestamp如session_start_at
,铅(时间戳)超过(通过event.timestamp event.user_id顺序分区)为next_session_start_at
FROM
(选择
e.user_id
,e.timestamp
,DATEDIFF(分钟,LAG(e.timestamp)OVER(以e.user_id排序或以e.timestamp排序),e.timestamp)AS inactivity_time
FROM events AS e
)作为事件
WHERE(event。 inactivity_time> 30 OR event.inactivity_time为null)
我们可以将该表另存为会话 数据集市,以在以后的查询中使用它。
有了该表后,就可以轻松回答我们在一开始概述的用户分析问题。例如,要计算平均会话持续时间,我们可以使用以下SQL。
SELECT
COUNT(*)AS会话数,
AVG(持续时间)AS average_session_duration
FROM(
SELECT session_id
,DATEDIFF(分钟,MIN(events.timestamp),MAX(events.timestamp))AS持续时间
FROM会话
LEFT JOIN事件上的事件.user_id =会话.user_id
AND events.timestamp> = events.session_start_at
AND(events.timestamp <会话.next_session_start_at OR会话.next_session_start_at为null)
GROUP BY 1
)
题库