全部产品
Search
文档中心

实时数仓Hologres:属性关联漏斗函数(finder_funnel)

更新时间:Dec 17, 2024

属性关联漏斗函数持在特定的窗口期内计算事件的漏斗结果,且可以指定事件关联属性,但不能按照时间进行分组。本文为您介绍属性关联漏斗函数的使用。

背景信息

属性关联漏斗函数支持对任意事件的属性进行关联,例如游戏场景中,设置的漏斗为“登录账号>进入游戏>游戏操作>关卡结算>账号退出”等,并为每个事件设置了“国家”的属性,此时就可以将该属性作为关联ID,保证每个步骤转化都是按照同一个属性值进行转化。漏斗不同步骤关联的属性可以是相同属性,也可以是不同属性,但是要求属性的类型必须一致。

使用限制

仅支持Hologres V2.2.32及以上版本的实例使用该函数。

注意事项

漏斗函数均需要由具备Superuser权限的账号执行以下语句开启Extension。

CREATE extension flow_analysis; --开启Extension
  • Extension是数据库级别的函数,一个数据库只需开启一次即可。

  • Extension默认加载到public Schema下,且不支持加载到其他Schema。

属性关联漏斗(finder_funnel)

计算每个用户在一段时间窗口内的表现,支持指定事件维度关联分析。

  • 函数语法:

    finder_funnel(window, start_timestamp, step_interval, step_numbers, num_events, attr_realted, time_zone, is_relative_window, server_timestamp, client_timestamp, prop1, prop2, ..., check_event1, check_event2...)
  • 参数说明

    参数名

    是否必填

    描述

    window

    分析统计的窗口时间大小,单位为毫秒。

    start_timestamp

    分析开始的时间,支持TIMESTAMP和TIMESTAMPTZ类型。

    step_interval

    一个步长的持续时间,指多大粒度内来计算转化分析,单位为秒。

    step_numbers

    需要分析的步长数。例如:step_interval=86400(1 天),step_numbers=7表示从start_timestamp开始分析7天内,每天的漏斗情况。

    num_events

    需要分析的事件数。

    attr_realted

    表示事件是否具备关联属性。INT类型数字,用二进制表示后,第i位为1,表示第i+1个事件具备关联属性。通常情况下,attr_realted需要与prop联合使用,转换后的二进制中包含多少个1,就需要填写多少个prop表达式。

    说明

    当attr_realted参数值为0时,表示不具备关联属性。

    time_zone

    TEXT类型,表示输入时间对应的时区,必须采用标准的时区格式,例如Asia/Shanghai。仅当is_relative_window设置为true时,才会对输出结果产生影响(即按照时区展示结果)。

    is_relative_window

    表示是否为多自然日窗口,默认值为false,若设置为true,对其他参数有以下几个限制:

    • window:参数值必须为86400000的整数倍。

    • step_interval:参数值必须为86400,即一个观察步长是一天。

    说明

    自然日是指每天的00:00:00~23:59:59,其中第一个自然日是事件发生时间~23:59:59,后面的自然日是整天。通常按照自然日作为窗口可以用来观察每天的漏斗情况,以实现业务的进一步精细化运营。

    server_timestamp

    事件发生的服务器时间,支持TIMESTAMP和TIMESTAMPTZ类型,用于函数运行时,计算事件所属的事件槽位/步进。

    client_timestamp

    事件发生的客户端时间,支持TIMESTAMP和TIMESTAMPTZ类型,其类型需要和start_timestamp保持一致,用于函数运行时对数据进行排序。

    prop

    表示事件的关联属性,每个prop类型必须相同,否则无法进行比较。

    check_event

    需要分析的转化事件列表,在window定义的时长范围内,满足条件的事件将会被认为有效事件,参与转化分析。如有3个事件,则输入EventName = 'E0001', EventName = 'E0002', EventName = 'E0003'

  • 返回结果

    该函数返回的结果是{<最终到达的第几个事件>, <每个步长内最终到达的第几个事件>}

    说明

    结果中最终到达的第几个事件,是指每个步长结果中取最长的事件数。

漏斗结果集合(funnel_rep)

funnel_rep支持对finder_funnel计算的明细漏斗结果进行聚合计算,使用详情请参见维度分组漏斗函数(finder_group_funnel)

示例数据

您需要先执行以下命令完成数据准备。

CREATE TABLE finder_funnel_test_1(id INT, event_time TIMESTAMP, event TEXT, province TEXT,city TEXT);

INSERT INTO finder_funnel_test_1 VALUES 
(1111, '2024-01-02 00:00:00', '注册', '北京','北京'), 
(1111, '2024-01-02 00:00:01', '登录', '北京','北京'), 
(1111, '2024-01-02 00:00:02', '付费', '北京','北京'), 
(1111, '2024-01-02 00:00:03', '退出', '北京','北京'), 

(1111, '2024-01-03 00:00:00', '注册', '北京','北京'), 
(1111, '2024-01-03 00:00:01', '登录', '北京','北京'), 
(1111, '2024-01-03 00:00:02', '付费', '北京','北京'), 

(1111, '2024-01-04 00:00:00', '注册', '北京','北京'), 
(1111, '2024-01-04 00:00:01', '登录', '北京','北京'), 


(2222, '2024-01-02 00:00:00', '注册', '浙江','杭州'), 
(2222, '2024-01-02 00:00:00', '登录', '浙江','杭州'), 
(2222, '2024-01-02 00:00:01', '付费', '浙江','杭州'), 
(2222, '2024-01-02 00:00:03', '付费', '浙江','杭州');

使用示例

场景1:计算每个用户在每个步长内到达的事件,不指定属性关联

本示例基于示例数据为您演示属性关联漏斗函数的使用。

查询窗口期为3天,步长为3,按天拆分步长,共4个事件参与转化的结果。命令如下:

--窗口期为3天,步长为3,按天拆分步长,共4个事件参与转化。
SELECT
    id,
    finder_funnel (86400000 * 3, EXTRACT(epoch FROM TIMESTAMP'2024-01-02 00:00:00')::BIGINT, 86400, 3, 4, 0, 'Asia/Shanghai', FALSE, event_time, event_time, event = '注册', event = '登录', event = '付费', event = '退出') AS funnel_res
FROM
    finder_funnel_test_1
GROUP BY
    id;

返回结果如下:

  id  | funnel_res 
------+------------
 2222 | {3,3,0,0}
 1111 | {4,4,3,2}
 (2 rows)

funnel_res的结果解读:第一个数字代表该用户最终到达的第几个事件,后面数字代表在每个步长内到达的第几个事件,例如id=1111, funnel_res={4,4,3,2}表示该用户最终到达的事件是第4个事件,其中第一个步长内到达了第4个事件,第二个步长内到达了第3个事件,第3个步长内到达了第2个事件。

场景2:指定事件属性关联

本示例基于示例数据为您演示属性关联漏斗函数的使用。

其中attr_realted=3,转换为二进制是11,表示第一个和第二个事件有关联属性。prop='province',表示两个事件的分析维度为province。

SELECT
    id,
    finder_funnel (86400000 * 3, EXTRACT(epoch FROM TIMESTAMP'2024-01-02 00:00:00')::BIGINT, 86400, 3, 4, 3, 'Asia/Shanghai', FALSE, event_time, event_time, province, province, event = '注册', event = '登录', event = '付费', event = '退出') AS funnel_res
FROM
    finder_funnel_test_1
GROUP BY
    id;

返回结果如下:

  id  | funnel_res 
------+------------
 2222 | {3,3,0,0}
 1111 | {4,4,3,2}
 (2 rows)

funnel_res的结果解读:按照属性关联后展示每个用户到达的最终事件和每个步长内到达的最终事件。

场景3:指定事件属性关联后聚合计算

本示例基于示例数据为您演示属性关联漏斗函数的使用。

SELECT
    funnel_rep (3, 4, funnel_res)
FROM (
    SELECT
        id,
        finder_funnel (86400000 * 3, EXTRACT(epoch FROM TIMESTAMP'2024-01-02 00:00:00')::BIGINT, 86400, 3, 4, 3, 'Asia/Shanghai', FALSE, event_time, event_time, province, province, event = '注册', event = '登录', event = '付费', event = '退出') AS funnel_res
    FROM
        finder_funnel_test_1
    GROUP BY
        id) a;

返回结果如下:

                funnel_rep                 
-------------------------------------------
 {"2,2,2,1","2,2,2,1","1,1,1,0","1,1,0,0"}
 (1 row)

场景4:多个自然日作为窗口

以多个自然日作为窗口,展示每个自然日的漏斗情况。本示例为您展示3个自然日内4个事件的漏斗结果。

  1. 创建表并插入数据。

    CREATE TABLE finder_funnel_test_3(id INT, event_time TIMESTAMP, event TEXT, province TEXT,city TEXT);
    
    INSERT INTO finder_funnel_test_3 VALUES 
    (1111, '2024-01-02 00:00:02', '注册', '北京','北京'), 
    (1111, '2024-01-02 00:00:03', '登录', '北京','北京'), 
    
    (1111, '2024-01-03 00:00:04', '付费', '北京','北京'), 
    
    (1111, '2024-01-05 00:00:01', '退出', '北京','北京'), 
    
    
    (2222, '2024-01-02 00:00:00', '注册', '浙江','杭州'), 
    (2222, '2024-01-02 00:00:00', '登录', '浙江','杭州'), 
    (2222, '2024-01-02 00:00:01', '付费', '浙江','杭州'), 
    (2222, '2024-01-02 00:00:03', '付费', '浙江','杭州');
  2. 按照3个自然日计算,2024-01-02日id=1111时,00:00:02~23:59:59为1个自然日,后面2024-01-03、2024-01-04分别为2个自然日,2024-01-05不在窗口期内,因此按照自然日观察的最终结果为id=1111时到达了第三个事件。

    SELECT
        id,
        finder_funnel (86400000 * 3, EXTRACT(epoch FROM TIMESTAMP'2024-01-02 00:00:00')::BIGINT, 86400, 3, 4, 0, 'Asia/Shanghai', TRUE, event_time, event_time, event = '注册', event = '登录', event = '付费', event = '退出') AS funnel_res
    FROM
        finder_funnel_test_3
    GROUP BY
        id;

    返回结果如下:

     id   | funnel_res 
    ------+------------
     1111 | {3,3,0,0}
     2222 | {3,3,0,0}
     (2 rows)