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:
İşlev, her kullanıcının olaylarını tarar ve zincirdeki ilk olayı arar.
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.
Analiz dönemindeki her gruplama aralığı için işlev, ulaşılan en derin adımı kaydeder.
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çinrange_funnel_timeverange_funnel_leveliş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_timeverange_funnel_levelHologres 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ı);
\Ntoplamı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:
loginvewatchaynı zaman damgasında gerçekleşir.mode='1'ile her ikisi de ayrı dönüşümler olarak sayılır;login1. adımı,watchise aynı anda 2. adımı eşleştirir, ardındanbuy3. 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
loginile 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) vebuy(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:
watch25 Eylül'de gerçekleşir, ancaklogin(1. adım) 25 Eylül'de gerçekleşmedi; burada hiçbir zincir başlamaz.2024-09-26, seviye 0:
buy26 Eylül'de gerçekleşir, ancak yineloginolmadığı 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.