2016-10-21 5 views
-1

ich einen Eingangsdatensatz in den folgenden Dummy-Dataset ähnlich haben:BigQuery/SQL: Daten-Set Transformation SELF mit JOIN und LAG

date  time  userid channel transaction 
20161012 12:00:00 1  seo  0 
20161018 16:50:00 1  referral 1 
20161011 09:20:00 2  sea  0 
20161020 12:20:00 2  direct  0 
20161020 20:40:00 2  facebook 0 
20161021 11:35:00 2  direct  1 
20161019 01:05:00 3  seo  0 
20161020 24:20:00 3  sea  1 
20161021 06:20:00 4  direct  1 

Ich möchte die folgende Ausgabe-Datensatz erhalten:

userid channel1 channel2 
1  seo  referral 
1  referral transaction 
2  sea  direct 
2  direct facebook 
2  facebook direct 
2  direct transaction 
3  seo  sea 
3  sea  transaction 
4  direct transaction 

In Worten, ich möchte einen Datensatz erstellen, der alle Schritte zwischen Kanälen aufzeichnet, die in der Customer Journey aufeinander folgen. Bezeichnen Sie, dass in der Ausgabe-Dataset-Transaktion als ein Kanal betrachtet wird.

Ich weiß, dass ich so etwas wie dieses JOIN durch Verwendung erreichen könnten in der Lage sein (auf sich selbst) und LAG aber ich bin nicht in der Lage, damit es funktioniert ...

Jeder, der eine einfache Lösung weiß, dies zu erhalten Ausgabe-Dataset?

Vielen Dank im Voraus!

+0

Wichtig bei SO - Sie können akzeptierte Antwort markieren, indem Sie das Häkchen links neben der geposteten Antwort unterhalb der Abstimmung verwenden. Siehe http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work#5235 warum dies wichtig ist! Es ist auch wichtig, über die Antwort zu stimmen. Stimmen Sie Antworten ab, die hilfreich sind. Es gibt mehr ... Sie können überprüfen, was zu tun ist, wenn jemand Ihre Frage beantwortet - http://stackoverflow.com/help/someone-answers. –

+0

Danke @MikhailBerlyant für Ihr Feedback. Allerdings habe ich Ihre Antwort nicht für meine endgültige Lösung verwendet. Deshalb habe ich deine Antwort nicht akzeptiert. – Tomas

Antwort

2

BigQuery Legacy-SQL unterstützt jedoch Window functions einschließlich LAG() und LEAD()

Gleiche gilt für BigQuery Standard-SQL - Analytic Functions sehen, sowie Enabling Standard SQL und Migrating from legacy SQL

unten in BigQuery Dialekt Ihrer Wahl Versuchen

SELECT 
    userid, channel1, IFNULL(channel2, "transaction") AS channel2, transaction 
FROM (
    SELECT 
    userid, DATE, TIME, transaction, channel AS channel1, 
    LEAD(channel) OVER(PARTITION BY userid ORDER BY DATE, TIME) AS channel2 
    FROM YourTable 
// ORDER BY userid, DATE, TIME