Zuerst die Antwort unter Verwendung von Standard-SQL, Ihre Hypothese gegeben: eine Tabelle EVENT mit einem einfachen Layout ist:
EVENTS
-----------------------------
SESION_ID , EVENT_NAME , TMST
die Sitzung zu erhalten, den Schritt # 1 zu einem bestimmten Zeitpunkt durchgeführt:
-- QUERY 1
SELECT SESSION_ID,MIN(TMST) FROM EVENTS WHERE EVENT_NAME='event1' GROUP BY SESSION_ID;
Hier mache ich die Annahme, dass event1 mehr als einmal pro Sitzung passieren kann. Das Ergebnis ist eine Liste eindeutiger Sitzungen, in denen zu einem bestimmten Zeitpunkt event1 angezeigt wurde.
Um Schritt 2 und Schritt 3 zu bekommen, kann ich nur das gleiche:
-- 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;
Jetzt wollen Sie Sitzungen wählen, den Schritt 1, Schritt 2 und Schritt 3 durchgeführt - in dieser Reihenfolge. Genauer gesagt müssen Sie die Sitzungen zählen, die Schritt 1 durchgeführt haben, dann die Sitzung zählen, die Schritt2 ausgeführt hat, und dann die Sitzungen zählen, die Schritt3 ausgeführt haben. Grundsätzlich müssen wir kombinieren einfach verbinden, um die drei oben Abfragen mit links an den Sitzungen auflisten, die den Trichter eingegeben und welche Schritte sie ausgeführt:
-- 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
Das Ergebnis ist eine Liste der einzigartigen Sitzung ist, die den Trichter in Schritt 1 eingegeben, und hat zu Schritt 2 und Schritt 3 fortgesetzt ... zB:
SESSION_ID_1,TRUE,TRUE,TRUE
SESSION_ID_2,TRUE,TRUE,FALSE
SESSION_ID_3,TRUE,FALSE,FALSE
...
Jetzt müssen wir nur einige Statistiken berechnen, zum Beispiel:
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à!
Jetzt für die Diskussion. Der erste Punkt, das Ergebnis ist ziemlich einfach, wenn Sie die "set" (oder funktionale) Art des Denkens und nicht die "prozedurale" Ansatz nehmen. Visualisiere die Datenbank nicht als eine Sammlung von festen Tabellen mit Spalten und Zeilen ... so ist es implementiert, aber es ist nicht die Art, wie du mit ihr interagierst. Es ist alles Sets, und Sie können die Sets so arrangieren, wie Sie es brauchen!
Zweiter Punkt, dass Abfrage automatisch optimiert wird, um parallel zu laufen, wenn Sie zum Beispiel eine MPP-Datenbank verwenden. Sie müssen die Abfrage nicht einmal anders programmieren, verwenden Sie map-reduce oder was auch immer ... Ich habe dieselbe Abfrage in meinem Test-Dataset mit mehr als 100 Millionen Ereignissen durchgeführt und Ergebnisse in Sekunden erhalten.
Last but not least eröffnet die Abfrage endlose Möglichkeiten.Gruppieren Sie einfach nach den Ergebnissen des Refeurs, den Keywords, der Landingpage, den Benutzerinformationen und analysieren Sie, was zum Beispiel die beste Konvertierungsrate bietet!
Nun, Sie können alle Ereignisse pro Sitzung ID in einem Reducer bekommen, wenn Sie denken, dass dies einfacher macht. –