Tüm Ürünler
Search
Belge Merkezi

Hologres:range_funnel

Son Güncelleme:Oct 06, 2026

range_funnel işlevi, kayan bir zaman penceresi içinde huni dönüşüm sonuçlarını hesaplar ve sonuçları özel bir gruplama aralığına göre ayırır; örneğin, çok günlük bir analiz dönemi boyunca günlük veya saatlik dönüşüm sayıları.

Çalışma mantığı

range_funnel her kullanıcı için olay dizilerini işler ve tanımladığınız huni adımlarında her kullanıcının ne kadar ilerlediğini sayar:

  1. İşlev, her kullanıcının olaylarını tarar ve zincirdeki ilk olayı arar.

  2. Bu başlangıç olayından itibaren yapılandırılan uzunluktaki bir zaman penceresi açar ve zincirdeki sonraki olayların bu pencere içinde gerçekleşip gerçekleşmediğini kontrol eder.

  3. Analiz dönemindeki her gruplama aralığı için işlev, ulaşılan en derin adımı kaydeder.

  4. Sonuçlar, aralık başına bir giriş ve genel bir özet girişi içeren kodlanmış bir BIGINT[] dizisi olarak döndürülür. Sonuçları çözmek için range_funnel_time ve range_funnel_level işlevlerini kullanın.

Tüm dönem için tek bir toplam sonuç döndüren windowFunnel işlevinden farklı olarak, range_funnel hem aralık bazlı ayrıntılı dökümü hem de genel toplamı döndürür. Ayrıca, zincirde aynı olayın birden fazla kez göründüğü hunileri destekler.

Tekrarlanan olaylar için eşleştirme mantığı:

  • Zincir: c1 → c2 → c3. Kullanıcı olayları: c1, c2, c1, c3. Sonuç: 3 (üç adımın tümü eşleşti).

  • Zincir: c1 → c1 → c1. Kullanıcı olayları: c1, c2, c1, c3. Sonuç: 2 (yalnızca iki eşleşen c1 olayı bulundu).

Ön koşullar

Başlamadan önce şunlara sahip olduğunuzdan emin olun:

  • Hologres V2.1 veya üzeri

  • Veritabanı için süper kullanıcı erişimi

Bir süper kullanıcı olarak aşağıdaki deyimi çalıştırarak flow_analysis uzantısını yükleyin:

CREATE extension flow_analysis;
Uzantı veritabanı düzeyinde yüklenir; her veritabanı için bir kez yüklemeniz yeterlidir. Her zaman public şemasına yüklenir ve başka bir şemaya taşınamaz.

Sınırlamalar

range_funnel işlevi Hologres V2.1 veya üzerini gerektirir. use_interval_window ve mode parametreleri Hologres V2.2.30 veya üzeri, ya da V3.0.17 veya üzeri sürümleri gerektirir. range_funnel_time ve range_funnel_level çözümleme işlevleri Hologres V2.1.6 veya üzerini gerektirir.

İşlev referansı

range_funnel

Söz dizimi

range_funnel(window, event_size, range_begin, range_end, interval, event_ts, event_bits[, use_interval_window[, mode]])

Parametreler

Parametre Tür Gerekli Açıklama
window INTERVAL Evet Zaman penceresinin saniye cinsinden uzunluğu. Pencere, ilk eşleşen olaydan başlar. Pencereleri takvim sınırlarına (örneğin, her gün gece yarısı) hizalamak için 0 olarak ayarlayın. use_interval_window=true olduğunda, değer pencereye dahil edilecek zaman periyodu sayısını (geçerli periyot dahil) temsil eder.
event_size INT Evet Huni zincirindeki toplam olay sayısı.
range_begin TIMESTAMPTZ / TIMESTAMP / DATE Evet Analiz döneminin başlangıcı.
range_end TIMESTAMPTZ / TIMESTAMP / DATE Evet Analiz döneminin bitişi.
interval INTERVAL Evet Her gruplama aralığının saniye cinsinden uzunluğu. Analiz dönemi, bu uzunluktaki ardışık aralıklara bölünür ve huni analizi her aralıkta bağımsız olarak çalışır.
event_ts TIMESTAMP / TIMESTAMPTZ Evet Her olayın zaman damgası. 00:00'dan hesaplandığı için zaman bileşeni gerçek duvar saati zamanını yansıtmayabilir. Gün veya hafta düzeyindeki eğilim analizi için bu parametreyi kullanın.
event_bits Bitmap (INT32) Evet Hangi olayların gerçekleştiğini temsil eden bit maskesi. Her bit konumu (en anlamsız bitten en anlamlı bite doğru) bir olayı temsil eder. En fazla 32 olayı destekler. Bu değeri Boole ifadelerinden oluşturmak için bit_construct işlevini kullanın.
use_interval_window TEXT Hayır Zaman penceresini tanımlamak için aralık uzunluğunun kullanılıp kullanılmayacağını belirtir. Varsayılan: false. true olarak ayarlandığında, window parametresi pencerenin kapsadığı zaman periyodu sayısını (geçerli periyot dahil) belirtir; bu, aralıklar arası dönüşüm analizi için kullanışlıdır. V2.2.30+ veya V3.0.17+ gerektirir.
mode TEXT Hayır Eşzamanlı olayların nasıl işleneceğini kontrol eder. Varsayılan: '0'. V2.2.30+ veya V3.0.17+ gerektirir. Aşağıdaki Mod seçenekleri bölümüne bakın.

Mod seçenekleri

mode parametresi, işlevin tam olarak aynı zaman damgasında gerçekleşen olayları nasıl işlediğini belirler.

Değer Davranış Olay zinciri örneği
'0' (varsayılan) Birden fazla olay aynı zaman damgasında gerçekleştiğinde, biri rastgele dönüşüm olarak seçilir; geri kalanlar atılır. Zincir: A → B → C. Olaylar: t=1'de A, t=1'de B, t=2'de C. Yalnızca A veya B'den biri sayılır; hangisinin seçildiğine bağlı olarak zincir en fazla 1. veya 2. adıma ulaşabilir.
'1' Aynı zaman damgasındaki farklı olaylar ayrı birer dönüşüm olarak sayılır. Aynı zaman damgasındaki özdeş olaylar bu modda desteklenmez. Zincir: A → B → C. Olaylar: t=1'de A, t=1'de B, t=2'de C. Hem A hem de B sayılır; zincir 3. adıma ulaşır (A 1. adımı, B 2. adımı, C 3. adımı eşleştirir).

Dönüş değeri

range_funnel bir BIGINT[] dizisi döndürür. Her öğe 64 bitlik kodlanmış bir tamsayıdır:

  • Bit 8–63 (56 bit): Aralığın başlangıç zaman damgası.

  • Bit 0–7 (8 bit): O aralıkta ulaşılan huni adımı.

Sonuçları yorumlamadan önce diziyi range_funnel_time ve range_funnel_level ile çözün. Çözülmüş çıktıda (\N) bulunan bir NULL girişi, tüm aralıklar genelindeki toplamı temsil eder.

Çözümleme işlevleri

Diziyi genişletmek için UNNEST kullanın, ardından her öğeyi range_funnel_time veya range_funnel_level ile sarın.

İşlev Giriş Çıkış Açıklama
range_funnel_time(element) range_funnel dizisinden bir BIGINT öğesi TIMESTAMPTZ Aralık başlangıç zamanını çözer.
range_funnel_level(element) range_funnel dizisinden bir BIGINT öğesi BIGINT Ulaşılan huni adımını çözer (0 = eşleşme yok, N = N adım eşleşti).

Söz dizimi

range_funnel_time(range_funnel())
range_funnel_level(range_funnel())
range_funnel_time ve range_funnel_level Hologres V2.1.6 veya üzerini gerektirir.

Örnekler

Çok günlük bir dönemde günlük dönüşümleri analiz etme

Bu örnek, üç günlük bir dönemde her gün CreateEvent olayından PushEvent olayına kaç kullanıcının ilerlediğini izlemek için genel GitHub olay veri kümesini kullanır.

Analiz parametreleri:

  • Zaman penceresi: 1 saat (3.600 saniye)

  • Analiz dönemi: 2024-01-29 ile 2024-01-31 arasında (3 gün)

  • Dönüşüm yolu: CreateEvent → PushEvent

  • Gruplama aralığı: 1 gün (86.400 saniye)

type sütunu metin değerleri içerir, ancak event_bits 32 bitlik bir bit haritası gerektirir. Metin alanını bit haritasına dönüştürmek için bit_construct işlevini kullanın.

1. Adım: Huni sorgusunu çalıştırma (kodlanmış çıktı)

SELECT
    actor_id,
    range_funnel(3600, 2, '2024-01-29', '2024-01-31', 86400, created_at::TIMESTAMP, bits) AS result
FROM (
    SELECT
        actor_id,
        created_at::TIMESTAMP,
        type,
        bit_construct(a := type = 'CreateEvent', b := type = 'PushEvent') AS bits
    FROM hologres_dataset_github_event.hologres_github_event
    WHERE ds >= '2024-01-29' AND ds <= '2024-01-31'
) tt
GROUP BY actor_id
ORDER BY actor_id;

Örnek çıktı (kodlanmış):

actor_id  | result
----------+------------------------------------------------------------
17        | {436860518400,436882636800,9223372036854775552}
47        | {436860518400,436882636800,9223372036854775552}
235       | {436860518401,436882636800,9223372036854775553}

Boş bir result değeri, kullanıcının olaylarının herhangi bir aralıkta huniyle eşleşmediği anlamına gelir.

2. Adım: Sonuçları kullanıcıya ve güne göre çözme

SELECT actor_id,
    TO_TIMESTAMP(range_funnel_time(result)) AS res_time,  -- Interval start time
    range_funnel_level(result) AS res_level               -- Funnel step reached
FROM (
    SELECT actor_id, result, COUNT(1) AS cnt FROM (
        SELECT actor_id,
            UNNEST(range_funnel(3600, 2, '2024-01-29', '2024-01-31', 86400, created_at::TIMESTAMP, bits)) AS result
        FROM (
            SELECT actor_id, created_at::TIMESTAMP, type,
                bit_construct(a := type = 'CreateEvent', b := type = 'PushEvent') AS bits
            FROM hologres_dataset_github_event.hologres_github_event
            WHERE ds >= '2024-01-29' AND ds <= '2024-01-31'
        ) a
        GROUP BY actor_id
    ) a
    GROUP BY actor_id, result
) a
ORDER BY actor_id, res_time
LIMIT 10000;

Örnek çıktı:

actor_id  | res_time              | res_level
----------+-----------------------+-----------
17        | 2024-01-29 08:00:00+08 | 0
17        | 2024-01-30 08:00:00+08 | 0
75        | 2024-01-29 08:00:00+08 | 2
75        | \N                    | 2
76        | 2024-01-29 08:00:00+08 | 0
76        | 2024-01-30 08:00:00+08 | 1
141       | 2024-01-29 08:00:00+08 | 2
141       | \N                    | 2
211       | 2024-01-30 08:00:00+08 | 1
235       | 2024-01-30 08:00:00+08 | 0
235       | \N                    | 1

Sonuçların okunması:

  • res_level = 0: Kullanıcı o gün eşleşen hiçbir olay tetiklemedi.

  • res_level = 1: Kullanıcı 1. adımı (CreateEvent) tamamladı ancak 2. adımı tamamlayamadı.

  • res_level = 2: Kullanıcı 1 saatlik pencere içinde her iki adımı da tamamladı.

  • res_time = \N: Tek bir gün değil, tüm analiz dönemi genelindeki toplam sonuç.

Satır satır yorumlama:

  • actor 17: 29 Ocak ve 30 Ocak'ta seviye 0'a ulaştı; her iki günde de eşleşen olay yok.

  • actor 75: 29 Ocak'ta seviye 2'ye ulaştı (1 saat içinde CreateEvent → PushEvent yolunun tamamını tamamladı); \N toplamının da seviye 2 göstermesi bunu doğrular.

  • actor 76: 29 Ocak'ta seviye 0'a (eşleşme yok) ve 30 Ocak'ta seviye 1'e ulaştı (CreateEvent gerçekleşti ancak 1 saat içinde PushEvent takip etmedi).

  • actor 235: 30 Ocak'ta seviye 0'a ve genel toplamda (\N) seviye 1'e ulaştı; bu, dönem boyunca bir CreateEvent'in eşleştiği ancak pencere içinde hiçbir zaman PushEvent'in takip etmediği anlamına gelir.

3. Adım: Günlük adım sayılarını özetleme

Bu sorgu, kullanıcı başına sonuçları günlük bir adım özetine dönüştürür. Her res_cnt değeri kümülatiftir: N. seviye, en az N adıma ulaşan tüm kullanıcıları içerir (çünkü her daha yüksek seviye, öncekinin bir alt kümesidir).

SELECT res_time, res_level, SUM(cnt) OVER (PARTITION BY res_time ORDER BY res_level DESC) AS res_cnt
FROM (
    SELECT
        TO_TIMESTAMP(range_funnel_time(result)) AS res_time,  -- Interval start time
        range_funnel_level(result) AS res_level,              -- Funnel step reached
        cnt
    FROM (
        SELECT result, COUNT(1) AS cnt FROM (
            SELECT actor_id,
                UNNEST(range_funnel(3600, 2, '2024-01-28', '2024-01-31', 86400, created_at::TIMESTAMP, bits)) AS result
            FROM (
                SELECT actor_id, created_at::TIMESTAMP, type,
                    BIT_CONSTRUCT(a := type = 'CreateEvent', b := type = 'PushEvent') AS bits
                FROM hologres_dataset_github_event.hologres_github_event
                WHERE ds >= '2024-01-28' AND ds <= '2024-01-30'
            ) a
            GROUP BY actor_id
        ) a
        GROUP BY result
    ) a
) a
WHERE res_level > 0
GROUP BY res_time, res_level, cnt
ORDER BY res_time, res_level;

Örnek çıktı:

res_time               | res_level | res_cnt
-----------------------+-----------+---------
2024-01-28 08:00:00+08 | 1         | 131212
2024-01-28 08:00:00+08 | 2         | 62371
2024-01-29 08:00:00+08 | 1         | 172505
2024-01-29 08:00:00+08 | 2         | 79667
2024-01-30 08:00:00+08 | 1         | 198585
2024-01-30 08:00:00+08 | 2         | 90291
\N                     | 1         | 440332
\N                     | 2         | 208942

2024-01-28 tarihinde 131.212 kullanıcı en az 1. adıma (CreateEvent) ulaştı ve bunlardan 62.371'i 1 saatlik pencere içinde 2. adımı (PushEvent) da tamamladı. \N satırı üç günlük toplamı gösterir: 440.332 kullanıcı 1. adıma ulaştı ve 208.942'si yolun tamamını tamamladı.

Eşzamanlı farklı olayları ayrı dönüşümler olarak sayma (mode='1')

Varsayılan olarak (mode='0'), aynı zaman damgasında iki farklı olay gerçekleşirse yalnızca biri sayılır. Her farklı eşzamanlı olayı ayrı bir dönüşüm olarak saymak için mode='1' ayarını yapın.

Bir test tablosu oluşturun ve örnek verileri ekleyin:

CREATE TABLE funnel_test (
    uid INT,
    event TEXT,
    create_time TIMESTAMPTZ
);

INSERT INTO funnel_test VALUES
    (11, 'login', '2024-09-26 16:15:28+08'),
    (11, 'watch', '2024-09-26 16:15:28+08'),  -- same timestamp as login
    (11, 'buy',   '2024-09-26 16:16:28+08'),
    (22, 'login', '2024-09-26 16:15:28+08'),
    (22, 'watch', '2024-09-26 16:16:28+08'),
    (22, 'buy',   '2024-09-26 16:17:28+08');

uid 11 için login ve watch aynı zaman damgasında gerçekleşir. mode='1' ile her iki olay da huni zincirine katkıda bulunur.

SELECT res_time, res_level, SUM(cnt) OVER (PARTITION BY res_time ORDER BY res_level DESC) AS res_cnt
FROM (
    SELECT
        TO_TIMESTAMP(range_funnel_time(result)) AS res_time,
        range_funnel_level(result) AS res_level,
        cnt
    FROM (
        SELECT result, COUNT(1) AS cnt FROM (
            SELECT uid,
                UNNEST(range_funnel(3600, 3, '2024-09-26', '2024-09-27', 86400, create_time::TIMESTAMP, bits, false, '1')) AS result
            FROM (
                SELECT uid, create_time::TIMESTAMP, event,
                    BIT_CONSTRUCT(a := event = 'login', b := event = 'watch', c := event = 'buy') AS bits
                FROM funnel_test
            ) a
            GROUP BY uid
        ) a
        GROUP BY result
    ) a
) a
GROUP BY res_time, res_level, cnt
ORDER BY res_time, res_level;

Çıktı:

res_time               | res_level | res_cnt
-----------------------+-----------+---------
2024-09-26 08:00:00+08 |         3 |       2
                       |         3 |       2
(2 rows)

Her iki kullanıcı da seviye 3'e ulaştı:

  • uid 11: login ve watch aynı zaman damgasında gerçekleşir. mode='1' ile her ikisi de ayrı dönüşümler olarak sayılır; login 1. adımı, watch ise aynı anda 2. adımı eşleştirir, ardından buy 3. adımı eşleştirir. Tam login → watch → buy zinciri eşleşir.

  • uid 22: Olaylar farklı zaman damgalarında gerçekleştiği için zincir, moddan bağımsız olarak normal şekilde eşleşir.

Çok günlük bir zaman penceresi ile günler arası dönüşümleri analiz etme (use_interval_window=true)

Dönüşüm yolunuz birden fazla günü kapsıyorsa use_interval_window=true ayarını yapın. window parametresi daha sonra kayan pencereye dahil edilecek gruplama aralığı sayısını (bu örnekte takvim günleri) belirtir.

Bir test tablosu oluşturun ve örnek verileri ekleyin:

CREATE TABLE funnel_test_2 (
    uid INT,
    event TEXT,
    create_time TIMESTAMPTZ
);

INSERT INTO funnel_test_2 VALUES
    (11, 'login', '2024-09-24 16:15:28+08'),
    (11, 'watch', '2024-09-25 16:15:28+08'),
    (11, 'buy',   '2024-09-26 16:16:28+08'),
    (22, 'login', '2024-09-24 16:15:28+08'),
    (22, 'watch', '2024-09-25 16:16:28+08'),
    (22, 'buy',   '2024-09-26 16:17:28+08');

Her iki kullanıcının olayları da üç ayrı takvim gününe yayılır. Bir günde başlayan ve sonraki iki gün içinde tamamlanan dönüşümleri yakalamak için use_interval_window=true ile window=3 ayarını yapın.

-- Time window: 3 calendar days
SELECT
    TO_TIMESTAMP(range_funnel_time(result)) AS res_time,
    range_funnel_level(result) AS res_level,
    cnt
FROM (
    SELECT result, COUNT(1) AS cnt FROM (
        SELECT uid,
            UNNEST(range_funnel(3, 3, '2024-09-24', '2024-09-27', 86400, create_time::TIMESTAMP, bits, true, '1')) AS result
        FROM (
            SELECT uid, create_time::TIMESTAMP, event,
                BIT_CONSTRUCT(a := event = 'login', b := event = 'watch', c := event = 'buy') AS bits
            FROM funnel_test_2
        ) a
        GROUP BY uid
    ) a
    GROUP BY result
) a;

Çıktı:

res_time               | res_level | cnt
-----------------------+-----------+-----
2024-09-26 08:00:00+08 |         0 |   2
                       |         3 |   2
2024-09-24 08:00:00+08 |         3 |   2
2024-09-25 08:00:00+08 |         0 |   2
(4 rows)

Satır satır yorumlama:

  • 2024-09-24, seviye 3: Her iki kullanıcı da 24 Eylül'de login ile başladı. 3 günlük bir pencere ile işlev 24, 25 ve 26 Eylül'e ileriye bakar; bu, watch (25 Eylül) ve buy (26 Eylül) olaylarını kapsar. Üç adımın tümü eşleştiği için her iki kullanıcı da bu günden başlayarak seviye 3'e ulaşır.

  • 2024-09-25, seviye 0: watch 25 Eylül'de gerçekleşir, ancak login (1. adım) 25 Eylül'de gerçekleşmedi; burada hiçbir zincir başlamaz.

  • 2024-09-26, seviye 0: buy 26 Eylül'de gerçekleşir, ancak yine login olmadığı için bu günde hiçbir zincir başlamaz.

  • \N, seviye 3: Genel toplam, her iki kullanıcının da dönem boyunca huninin tamamını tamamladığını doğrular.