2016-10-21 38 views
-1

我有類似下面的虛擬數據集的輸入數據集:的BigQuery/SQL:數據集轉換使用自聯接和滯後

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 

我希望得到下面的輸出數據集:

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 

換句話說,我想創建一個數據集,記錄客戶旅程中相互跟隨的所有渠道之間的所有步驟。表示在輸出數據集中事務被認爲是一個通道。

我知道,我也許可以通過使用JOIN(本身)和LAG實現這樣的事情,但我不能讓它工作...

任何人都知道一個簡單的解決方案,以獲得該輸出數據集?

在此先感謝!

+0

重要的是 - 您可以通過在投票的下方發佈的答案左側的勾號來「標記接受的答案」。看到http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work#5235爲什麼它很重要!對答案投票也很重要。表決有用的答案。還有更多......當某人回答你的問題時,你可以查看該怎麼做 - http://stackoverflow.com/help/someone-answers。 –

+0

感謝@MikhailBerlyant的反饋意見。儘管如此,我還沒有用你的答案來解決我的最終問題。這就是爲什麼我沒有接受你的答案。 – Tomas

回答

2

的BigQuery傳統的SQL不支持Window functions包括LAG()LEAD()

同一真正的爲BigQuery的標準SQL - 見Analytic Functions,以及Enabling Standard SQLMigrating from legacy SQL

嘗試以下在您選擇的BigQuery的方言

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