2016-10-21 1 views
-1

У меня есть входной набор данных, подобный следующему фиктивного набора данных:BigQuery/SQL: набор данных преобразования с помощью SELF JOIN и 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 

Я хотел бы получить следующий выходной набор данных:

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 

На словах я хочу создать набор данных, который записывает все шаги между каналами, которые следуют друг за другом в поездке клиента. Обозначим, что транзакция выходного datet рассматривается как канал.

Я знаю, что я мог бы быть в состоянии достичь что-то вроде этого с помощью JOIN (на себя) и LAG, но я не могу заставить его работать ...

Любой, кто знает простое решение, чтобы получить это выходной набор данных?

Заранее благодарен!

+0

Важно на SO - вы можете «пометить принятый ответ», используя отметку слева от опубликованного ответа ниже голосования. См. 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 SQL и Migrating 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