全部產品
Search
文件中心

Hologres:維度分組漏鬥函數(finder_group_funnel)

更新時間:Dec 13, 2024

維度分組漏鬥函數支援按照不同的維度對結果進行分組展示,並指定事件的關聯屬性。例如按天分組,按國家、IP分組等,以實現更細粒度的漏鬥分析。一個使用者只能出現在一個分組中,如果不屬於任何一個分組,則會被分配到“unreach”組。

使用限制

僅支援Hologres V2.2.32及以上版本的執行個體使用該函數。

注意事項

漏鬥函數均需要由具備Superuser許可權的帳號執行以下語句開啟Extension。

CREATE extension flow_analysis; --開啟Extension
  • Extension是資料庫層級的函數,一個資料庫只需開啟一次即可。

  • Extension預設載入到public Schema下,且不支援載入到其他Schema。

finder_group_funnel

指定事件按照選擇的維度進行分組,計算漏鬥結果。

函數文法

  • 文法

    finder_group_funnel(window, start_timestamp, step_interval, step_numbers, num_events, attr_related, group_event_index,time_zone,is_relative_window, server_timestamp, client_timestamp, group_dimension, prop1, prop2, ..., check_event1, check_event2...)
  • 參數說明

    參數名

    是否必填

    描述

    window

    分析統計的視窗大小,單位為毫秒。

    start_timestamp

    分析開始的時間,支援TIMESTAMP和TIMESTAMPTZ類型。

    step_interval

    一個步長的期間,指多大粒度內來計算轉化分析,單位為秒。

    step_numbers

    需要分析的步長數,例如:step_interval=86400(1天),step_number=7表示從start_timestamp開始分析7天內,每天的漏鬥的情況。

    num_events

    需要分析的事件數目。

    attr_related

    表示事件是否具備關聯屬性。UINT8類型數字,用二進位表示後,第i位為1,表示第i+1個事件具備關聯屬性。通常情況下,attr_realted需要與prop聯合使用,當attr_realted=1時,設定了多少個1,就需要填寫多少個prop運算式。

    group_event_index

    即按照哪個事件進行分組。

    例如:group_event_index = 1表示只要到達第一個事件,就會開始分組。而如果指定group_event_index = 2,表示只有到達了第二個事件時才會分組,未到達第二個事件的轉化會被統一歸入unreach分組。

    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保持一致,用於函數運行時對資料進行排序。

    group_dimension

    分組的維度選擇,如選擇channel_id欄位進行維度分組,按照channel_id的值展示分組後的資料。多個維度則使用concat_ws串連,即concat,目前僅支援TEXT類型的欄位進行分組。

    prop

    表示事件的關聯屬性,每個prop類型必須相同,否則無法進行比較。

    check_event

    需要分析的轉化事件列表,在window定義的時間長度範圍內,滿足條件的事件將會被認為有效事件,參與轉化分析。如有3個事件,則輸入EventName = 'E0001', EventName = 'E0002', EventName = 'E0003'

  • 返回結果

    返回一個編碼後的BINARY類型結果,需要使用finder_group_funnel_res函數進行解碼。

樣本

此處以一個簡單樣本為您展示finder_group_funnel函數的用法。

  1. 準備finder_group_funnel_test表並插入資料。

    CREATE TABLE finder_group_funnel_test(id INT, event_time TIMESTAMP, event TEXT, province TEXT,city TEXT);
    
    INSERT INTO finder_group_funnel_test 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', '付費', '浙江','杭州');
  2. 按照province欄位進行分組展示,命令如下:

    SELECT
        id,
        UNNEST(finder_group_funnel (86400000 * 3, EXTRACT(epoch FROM TIMESTAMP'2024-01-02 00:00:00')::BIGINT, 86400, 3, 4, 0, 1, 'Asia/Shanghai', FALSE, event_time, event_time, province, event = '註冊', event = '登陸', event = '付費', event = '退出')) AS result
    FROM
        finder_group_funnel_test
    GROUP BY
        id;

    返回結果如下:result值為編碼後的結果,需要使用下述的finder_group_funnel_res函數進行解碼,詳情請參見finder_group_funnel_res

      id  | result      
    ------+-----------------
     2222 | 浙江
     2222 | unreach
     1111 | 北京
     1111 | unreach
    (4 rows)

finder_group_funnel_res

對finder_group_funnel函數返回的BINARY結果中的漏鬥詳情進行解碼。

函數文法

  • 文法

    finder_group_funnel_res(finder_group_funnel())
  • 參數說明

    finder_group_funnel():指定事件按照選擇維度進行分組後計算得到的漏鬥結果。詳情請參見finder_group_funnel

  • 返回結果

    返回解碼後的結果。

樣本

本樣本基於finder_group_funnel樣本的結果進行解碼,展示每個使用者的詳細漏鬥情況,命令如下:

SELECT
    id,
    finder_group_funnel_res (result) AS res
FROM (
    SELECT
        id,
        UNNEST(finder_group_funnel (86400000 * 3, EXTRACT(epoch FROM TIMESTAMP'2024-01-02 00:00:00')::BIGINT, 86400, 3, 4, 0, 1, 'Asia/Shanghai', FALSE, event_time, event_time, province, event = '註冊', event = '登陸', event = '付費', event = '退出')) AS result
    FROM
        finder_group_funnel_test
    GROUP BY
        id) a; 

返回結果如下:

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

finder_group_funnel_text_group

對finder_group_funnel函數返回的BINARY類型結果中的分組欄位進行解碼,通常和finder_group_funnel_res函數組合使用。

函數文法

  • 文法

    finder_group_funnel_text_group(finder_group_funnel())
  • 參數說明

    finder_group_funnel():指定事件按照選擇維度進行分組後計算得到的漏鬥結果。詳情請參見finder_group_funnel

  • 返回結果

    返回解碼後的結果。

樣本

本樣本基於finder_group_funnel樣本的結果進行解碼,為您展示每個使用者分組後的漏鬥結果、最終到達的事件,及每個步長內最終到達的事件。命令如下:

SELECT
    id,
    finder_group_funnel_text_group (result) AS key,
    finder_group_funnel_res (result) AS res
FROM (
    SELECT
        id,
        UNNEST(finder_group_funnel (86400000 * 3, EXTRACT(epoch FROM TIMESTAMP'2024-01-02 00:00:00')::BIGINT, 86400, 3, 4, 0, 1, 'Asia/Shanghai', FALSE, event_time, event_time, province, event = '註冊', event = '登陸', event = '付費', event = '退出')) AS result
    FROM
        finder_group_funnel_test
    GROUP BY
        id) a;

返回結果如下:

  id  |   key   |    res    
------+---------+-----------
 2222 | 浙江    | {3,3,0,0}
 2222 | unreach | {0,0,0,0}
 1111 | 北京    | {4,4,3,2}
 1111 | unreach | {0,0,0,0}
(4 rows)

漏鬥結果彙總函式(funnel_rep)

用於彙總FINDER_FUNNEL和finder_group_funnel的計算結果,形成漏鬥每一層所有使用者的匯總結果。

函數文法

  • 文法

    funnel_rep(step_number, num_events, funnel_res)
  • 參數說明

    參數名

    是否必填

    描述

    step_number

    UINT類型,包含的時間槽位元量,通常和finder_funnel函數中的step_numbers值保持一致。

    例如:step_numbers=7表示觀察7個時間槽位。

    num_events

    UINT類型值,表示參與轉化的事件總數,通常和finder_funnel函數中check_event的事件數目量保持一致。

    funnel_res

    表示每一個使用者產生的所有轉化步驟明細,是finder_funnel的輸出結果。

  • 返回結果

    返回一個元素類型為字串的一維數組,格式為{"n1,...,nn","m1,...,mn"},表示總的漏鬥情況(第1-N個事件匹配到的使用者數)以及每個步長內的漏鬥情況(第1-N個事件匹配到的使用者數)。

樣本

本樣本基於樣本中的資料,為您展示在視窗期為3天、步長為3天的情況下,如何計算每個使用者到達的事件。命令如下:

--3天的視窗期,一個步長為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, 0, 'Asia/Shanghai', FALSE, event_time, event_time, event = '註冊', event = '登陸', event = '付費', event = '退出') AS funnel_res
    FROM
        finder_group_funnel_test
    GROUP BY
        id) a;

返回結果如下:

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

完整使用樣本

情境1:按照多天為視窗分組展示使用者的漏鬥結果

以省份為維度,依次發生4個事件的情況下,分析3天內的漏鬥情況及每天的漏鬥情況。

  1. 準備資料,命令如下。

    CREATE TABLE finder_group_funnel_test_1(id INT, event_time TIMESTAMP, event TEXT, province TEXT,city TEXT);
    
    INSERT INTO finder_group_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', '付費', '浙江','杭州'),
    
    (3333, '2024-01-02 00:00:00', '註冊', '上海','上海'), 
    (3333, '2024-01-02 00:00:00', '登陸', '上海','上海'), 
    (3333, '2024-01-02 00:00:01', '付費', '上海','上海'), 
    (3333, '2024-01-02 00:00:03', '付費', '上海','上海'),
    (3333, '2024-01-02 00:00:04', '退出', '上海','上海');
  2. 以省份為維度,依次發生4個事件,分析3天內的漏鬥情況及每天的漏鬥情況。命令如下:

    SELECT
        key,
        funnel_rep (3, 4, res) AS ans
    FROM (
        SELECT
            id,
            finder_group_funnel_text_group (result) AS key,
            finder_group_funnel_res (result) AS res
        FROM (
            SELECT
                id,
                UNNEST(finder_group_funnel (86400000 * 3, EXTRACT(epoch FROM TIMESTAMP'2024-01-02 00:00:00')::BIGINT, 86400, 3, 4, 0, 1, 'Asia/Shanghai', FALSE, event_time, event_time, province, event = '註冊', event = '登陸', event = '付費', event = '退出')) AS result
            FROM
                finder_group_funnel_test_1
            GROUP BY
                id) a) b
    GROUP BY
        key;

    返回結果如下:

       key   |                    ans                    
    ---------+-------------------------------------------
     北京    | {"1,1,1,1","1,1,1,1","1,1,1,0","1,1,0,0"}
     unreach | {"0,0,0,0","0,0,0,0","0,0,0,0","0,0,0,0"}
     上海    | {"1,1,1,1","1,1,1,1","0,0,0,0","0,0,0,0"}
     浙江    | {"1,1,1,0","1,1,1,0","0,0,0,0","0,0,0,0"}
    (4 rows)

情境2:多個自然日作為視窗,按自然日分組展示漏鬥結果

  1. 準備資料,命令如下。

    CREATE TABLE finder_group_funnel_test_2(id INT, event_time TIMESTAMP, event TEXT, province TEXT,city TEXT);
    
    INSERT INTO finder_group_funnel_test_2 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. 以省份為維度,依次發生4個事件,分析3天內的漏鬥情況以及每個自然日的漏鬥情況。命令如下:

    SELECT
        key,
        funnel_rep (3, 4, res) AS ans
    FROM (
        SELECT
            id,
            finder_group_funnel_text_group (result) AS key,
            finder_group_funnel_res (result) AS res
        FROM (
            SELECT
                id,
                UNNEST(finder_group_funnel (86400000 * 3, EXTRACT(epoch FROM TIMESTAMP'2024-01-02 00:00:00')::BIGINT, 86400, 3, 4, 0, 1, 'Asia/Shanghai', TRUE, event_time, event_time, province, event = '註冊', event = '登陸', event = '付費', event = '退出')) AS result
            FROM
                finder_group_funnel_test_2
            GROUP BY
                id) a) b
    GROUP BY
        key;

    返回結果如下:

       key   |                    ans                    
    ---------+-------------------------------------------
     unreach | {"0,0,0,0","0,0,0,0","0,0,0,0","0,0,0,0"}
     浙江    | {"1,1,1,0","1,1,1,0","0,0,0,0","0,0,0,0"}
     北京    | {"1,1,1,0","1,1,1,0","0,0,0,0","0,0,0,0"}
    (3 rows)