本文介绍 留存分析函数 的使用场景,和函数的基本用法。
留存分析函数业务场景:选定一段时间范围,观察此时间范围内每一个时间单位的符合某维度的用户在一段时间范围之后的留存。
使用 genArrayIf
函数将初访(first_events
)及回访(return_events
)行为数据预聚合到指定的时间槽位中,得到 Array(UInt8)
格式的访问情况位集 bitset
。这一步将时间范围切分成离散的时间槽位,并且用位集表示每个槽位上事件发生与否。
genArrayIf(number_steps, begin_timestamp, step_time)(timestamp, if_expr)
输入参数:
number_steps
:时间槽位的数量。begin_timestamp
:分析开始时间戳,如数据筛选的范围从 2022-06-01 开始,所以开始时间戳为 toUInt64(toUnixTimestamp('2022-06-01')) = 1654012800。step_time
:1个时间槽位持续时长。timestamp
: 事件时间戳所在列。需要先转换成时间戳,再转换成Uint64 格式。if_expr
:对留存条件的定义,满足条件的将会被认为行为发生。输出参数:
Array(UInt8)
格式的访问情况位集 bitset
。示例:
在下面的例子中,返回结果表达了7天中,每个单位时间(1天)中是否发生了 EventName = 'E0002'
的事件。
SELECT Visitor, genArrayIf(7, 1654012800, 86400)(toUInt64(toUnixTimestamp(LOG.EventTime)), EventName = 'E0002') AS return_events FROM LOG WHERE (EventTime >= '2022-06-01') AND (EventTime < '2022-06-08') AND (EventName = 'E0002') GROUP BY Visitor
使用 **retention2
**聚合用户初访(first_events
)、回访(return_events
)位集得到每个时间槽对应的留存数据。
retention2(number_steps)(first_events, return_events)
输入参数:
number_steps
: 时间槽位的数量。number_steps
取值和genArrayIf
中的number_steps
保持一致。说明
注意:
number_steps
取值范围受 初访(first_events)、回访(return_events)位集 大小的限制的,规则是(events_array.size()-1)*8 < number_steps <= events_array.size()*8
。比如下面示例中 first_events 的 UInt8 类型元素个数为 2,则传入的窗口大小应该为 (8, 16]
间某个值。first_events
:初访事件的位集,需要genArrayIf
返回。return_events
:回访事件的位集,需要genArrayIf
返回。输出参数:
Array(UInt64)
格式的留存数组。示例 SQL:
观察一周 7 天的窗口内,按城市分组,首访('E0001')到回访('E0002')留存情况。
SELECT City, retention2(7)(first_events, return_events) FROM ( SELECT City, Visitor, genArrayIf(7, 1654012800, 86400)(toUInt64(toUnixTimestamp(LOG.EventTime)), EventName = 'E0001') AS first_events FROM LOG WHERE (EventTime >= '2022-06-01') AND (EventTime < '2022-06-08') AND (EventName = 'E0001') GROUP BY Visitor, City ) AS t1 ANY LEFT JOIN ( SELECT Visitor, genArrayIf(7, 1654012800, 86400)(toUInt64(toUnixTimestamp(LOG.EventTime)), EventName = 'E0002') AS return_events FROM LOG WHERE (EventTime >= '2022-06-01') AND (EventTime < '2022-06-08') AND (EventName = 'E0002') GROUP BY Visitor ) AS t2 ON t1.Visitor = t2.Visitor GROUP BY City ORDER BY City ASC SETTINGS distributed_product_mode = 'local', distributed_group_by_no_merge = 0
返回:
得到 7*7 的数组,如上图中 city1 解析为:
109777,61903,62185,62116,62064,62066,61952, 0,109978,61922,62500,61817,62671,62417, 0,0,110033,62193,62177,62230,62287, 0,0,0,109715,61833,62142,62119, 0,0,0,0,110598,62493,62515, 0,0,0,0,0,109508,61909, 0,0,0,0,0,0,110746
可根据需要,计算出从 Day1->Day6 的 1 日转化率。
根据实际需求,可以将时间槽修改为周、月等。