最初の答えは、標準 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;
ここで、ステップ 1、ステップ 2、およびステップ 3 をこの順序で実行したセッションを選択します。より正確には、ステップ 1 を実行したセッションをカウントし、次にステップ 2 を実行したセッションをカウントし、次にステップ 3 を実行したセッションをカウントする必要があります。基本的には、上記の 3 つのクエリを left join と組み合わせて、目標到達プロセスに入ったセッションと、それらが実行したステップを一覧表示するだけです。
-- 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データベースを使用している場合、クエリが自動的に最適化されて並列実行されるという2番目のポイント。map-reduce などを使用して、クエリを別の方法でプログラムする必要さえありません... 1 億を超えるイベントを含むテスト データセットで同じクエリを実行し、数秒で結果を取得しました。
最後になりましたが、クエリによって無限の可能性が開かれます。リファラー、キーワード、ランディング ページ、ユーザー情報で結果をグループ化し、たとえばどれが最高のコンバージョン率を提供するかを分析します!