首先给出答案,使用标准 SQL,给定您的假设:有一个表 EVENTS 具有简单的布局:
EVENTS
-----------------------------
SESION_ID , EVENT_NAME , TMST
要获取在某个时间执行步骤#1 的会话:
-- QUERY 1
SELECT SESSION_ID,MIN(TMST) FROM EVENTS WHERE EVENT_NAME='event1' GROUP BY SESSION_ID;
在这里,我假设 event1 可以在每个会话中发生不止一次。结果是在某个时间展示 event1 的唯一会话列表。
为了获得 step2 和 step3,我可以这样做:
-- 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;
现在,您要选择按顺序执行 step1、step2 和 step3 的会话。更准确地说,您需要计算执行第 1 步的会话数,然后计算执行第 2 步的会话数,然后计算执行第 3 步的会话数。基本上,我们只需要将上述 3 个查询与左连接结合起来,就可以列出进入漏斗的会话以及它们执行的步骤:
-- 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
结果是在第 1 步进入渠道的唯一会话列表,并且可能已继续到第 2 步和第 3 步......例如:
SESSION_ID_1,TRUE,TRUE,TRUE
SESSION_ID_2,TRUE,TRUE,FALSE
SESSION_ID_3,TRUE,FALSE,FALSE
...
现在我们只需要计算一些统计数据,例如:
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
等等瞧!
现在进行讨论。第一点,鉴于您采用“设置”(或功能)思维方式而不是“程序”方法,结果非常简单。不要将数据库可视化为具有列和行的固定表的集合......这就是它的实现方式,但它不是您与之交互的方式。都是套装,你可以按照你需要的方式安排套装!
第二点,如果您使用的是 MPP 数据库,查询将自动优化为并行运行。您甚至不需要对查询进行不同的编程,使用 map-reduce 或其他任何东西......我在我的测试数据集上运行了相同的查询,其中包含超过 1 亿个事件,并在几秒钟内获得结果。
最后但并非最不重要的一点是,查询打开了无限的可能性。只需按推荐人、关键字、登陆页面、用户信息对结果进行分组,并分析哪个提供了最佳转化率!