首先答案,使用标准的SQL,因为你的假设:
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的唯一会话列表。
为了得到第二步第三步和,我可以做相同的:
-- 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;
现在,你要选择进行第一步,第二步和第三步的会议 - 按照这个顺序。 更准确地说,您需要对执行步骤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
结果是谁在第一步进入渠道的唯一会话列表,并可能继续第二步第三步和...例如:
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
等voilà!
现在进行讨论。 第一点,结果是非常简单的,因为你采取“集”(或功能)的思维方式,而不是“程序性”的方法。不要将数据库可视化为包含列和行的固定表的集合......这是如何实现的,但它不是与它进行交互的方式。这是所有的设置,你可以按照你需要的方式来安排这些设置!
第二点,如果您正在使用MPP数据库,查询将自动优化为并行运行。您甚至不需要以不同的方式编写查询,使用map-reduce或其他任何方法......我在测试数据集上运行了超过1亿次事件的相同查询,并在几秒钟内获得结果。
最后但并非最不重要的是,查询打开无限的可能性。只需根据引用者的结果,关键字,登陆页面,用户信息和分析结果进行分组,这些信息提供了最佳转换率!
那么你可以在减速器中获得每个会话ID的所有事件,如果你认为这使得它更容易。 –