Trước câu trả lời, sử dụng SQL tiêu chuẩn, được đưa ra giả thuyết của bạn: có một bảng SỰ KIỆN với một bố cục đơn giản:
EVENTS
-----------------------------
SESION_ID , EVENT_NAME , TMST
Để có được phiên thực hiện bướC# 1 tại một số thời gian:
-- QUERY 1
SELECT SESSION_ID,MIN(TMST) FROM EVENTS WHERE EVENT_NAME='event1' GROUP BY SESSION_ID;
Ở đây tôi giả định rằng event1 có thể xảy ra sau đó một lần mỗi phiên. Kết quả là một danh sách các phiên duy nhất đã chứng minh event1 tại một thời điểm nào đó.
Để có được bước 2 và step3, tôi chỉ có thể làm như vậy:
-- QUERY 2
SELECT SESSION_ID,MIN(TMST) FROM EVENTS WHERE EVENT_NAME='event2' GROUP BY SESSION_ID;
-- QUERY 3
SELECT SESSION_ID,MIN(TMST) FROM EVENTS WHERE EVENT_NAME='event3' GROUP BY SESSION_ID;
Bây giờ, bạn muốn chọn phiên thực hiện bước 1, bước 2 và step3 - theo thứ tự đó. Chính xác hơn, bạn cần đếm các phiên thực hiện bước 1, sau đó đếm phiên thực hiện bước 2, sau đó đếm số phiên thực hiện bước 3. Về cơ bản chúng tôi chỉ cần kết hợp 3 trên các truy vấn với trái tham gia vào danh sách các phiên vào phễu và những bước họ thực hiện:
-- FUNNEL FOR S1/S2/S3
SELECT
SESSION_ID,
Q1.TMST IS NOT NULL AS PERFORMED_STEP1,
Q2.TMST IS NOT NULL AS PERFORMED_STEP2,
Q3.TMST IS NOT NULL AS PERFORMED_STEP3
FROM
-- QUERY 1
(SELECT SESSION_ID,MIN(TMST) FROM EVENTS WHERE EVENT_NAME='event1' GROUP BY SESSION_ID) AS Q1,
LEFT JOIN
-- QUERY 2
(SELECT SESSION_ID,MIN(TMST) FROM EVENTS WHERE EVENT_NAME='event2' GROUP BY SESSION_ID) AS Q2,
LEFT JOIN
-- QUERY 3
(SELECT SESSION_ID,MIN(TMST) FROM EVENTS WHERE EVENT_NAME='event2' GROUP BY SESSION_ID) AS Q3
-- Q2 & Q3
ON Q2.SESSION_ID=Q3.SESSION_ID AND Q2.TMST<Q3.TMST
-- Q1 & Q2
ON Q1.SESSION_ID=Q2.SESSION_ID AND Q1.TMST<Q2.TMST
Kết quả là một danh sách các phiên duy nhất người tham gia kênh ở bước 1, và có thể tiếp tục bước 2 và step3 ... ví dụ:
SESSION_ID_1,TRUE,TRUE,TRUE
SESSION_ID_2,TRUE,TRUE,FALSE
SESSION_ID_3,TRUE,FALSE,FALSE
...
Bây giờ chúng ta chỉ cần phải tính toán một số số liệu thống kê, ví dụ:
SELECT
STEP1_COUNT,
STEP1_COUNT-STEP2_COUNT AS EXIT_AFTER_STEP1,
STEP2_COUNT*100.0/STEP1_COUNT AS PERCENTAGE_TO_STEP2,
STEP2_COUNT-STEP3_COUNT AS EXIT_AFTER_STEP2,
STEP3_COUNT*100.0/STEP2_COUNT AS PERCENTAGE_TO_STEP3,
STEP3_COUNT*100.0/STEP1_COUNT AS COMPLETION_RATE
FROM
(-- QUERY TO COUNT session at each step
SELECT
SUM(CASE WHEN PERFORMED_STEP1 THEN 1 ELSE 0 END) AS STEP1_COUNT,
SUM(CASE WHEN PERFORMED_STEP2 THEN 1 ELSE 0 END) AS STEP2_COUNT,
SUM(CASE WHEN PERFORMED_STEP3 THEN 1 ELSE 0 END) AS STEP3_COUNT
FROM
[... insert the funnel query here ...]
) AS COMPUTE_STEPS
Et voilà!
Bây giờ để thảo luận. Điểm đầu tiên, kết quả là khá đơn giản cho bạn sử dụng cách suy nghĩ "thiết lập" (hoặc chức năng) chứ không phải cách tiếp cận "thủ tục". Đừng hình dung cơ sở dữ liệu như một tập hợp các bảng cố định với các cột và các hàng ... đây là cách nó được thực hiện, nhưng nó không phải là cách bạn tương tác với nó. Đó là tất cả các bộ, và bạn có thể sắp xếp các bộ như cách bạn cần!
Điểm thứ hai mà truy vấn sẽ tự động được tối ưu hóa để chạy song song nếu bạn đang sử dụng cơ sở dữ liệu MPP chẳng hạn. Bạn thậm chí không cần phải lập trình truy vấn một cách khác nhau, sử dụng map-reduce hoặc bất cứ điều gì ... Tôi chạy cùng một truy vấn trên bộ dữ liệu thử nghiệm của mình với hơn 100 triệu sự kiện và nhận kết quả tính bằng giây.
Cuối cùng nhưng không kém phần quan trọng, truy vấn mở ra khả năng vô tận.Chỉ cần nhóm theo kết quả của người giới thiệu, từ khóa, trang đích, thông tin người dùng và phân tích cung cấp tỷ lệ hội tụ tốt nhất chẳng hạn!
Bạn cũng có thể nhận tất cả các sự kiện trên mỗi ID phiên trong bộ giảm tốc nếu bạn nghĩ điều này giúp dễ dàng hơn. –