You need to enable JavaScript to run this app.
导航
留存分析函数
最近更新时间:2024.06.28 11:59:38首次发布时间:2024.06.28 11:59:38

本文介绍 留存分析函数 的使用场景,和函数的基本用法。
留存分析函数业务场景:选定一段时间范围,观察此时间范围内每一个时间单位的符合某维度的用户在一段时间范围之后的留存。

genArrayIf()

使用 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()

使用 **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] 间某个值。
  • 初访数组,回访数组大小需要保持一致,不一致的情况下最终计算结果会不正确,出现很多0。
  • 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 日转化率。
根据实际需求,可以将时间槽修改为周、月等。