2015-10-27 2 views
1

У меня есть таблица BigQuery, как показано ниже:BigQuery - Пользовательские Лаг Смещение при использовании функции Лаг

date hits_eventInfo_Category hits_eventInfo_Action session_id user_id hits_time hits_eventInfo_Label 

20151021 Air Search 1445001 A232 1952 City1 
20151021 Air Select 1445001 A232 2300 Vendor1 
20151021 Air Search 1445001 A111 1000 City2 
20151021 Air Search 1445001 A111 1900 City3 
20151021 Air Select 1445001 A111 7380 Vendor2 
20151021 Air Search 1445001 A580 1000 City4 
20151021 Air Search 1445001 A580 1900 City5 
20151021 Air Search 1445001 A580 1900 City6 
20151021 Air Select 1445001 A580 7380 Vendor3 

В таблице показаны активности пользователей для 3-х пользователей - A232, A111 и A580, такие, что:

i) A232 - Made 1 Search at 'City1' and chose 'Vendor1' from 'City1' 
ii) A111 - Made the 1st search at 'City2' and did not choose any vendor from there. Made a 2nd search at 'City3' and then ultimately chose a 'Vendor2' from here. 
iii) A580 - 1st search at 'City4', no vendor chosen. 2nd search at 'City5', no vendor chosen. 3rd search at 'City6', 'Vendor3' chosen from City6. 

Меня интересует только получение города, из которого пользователь фактически выбрал поставщика, то есть не заинтересовался предыдущими поисками пользователя, которые не привели к выбору поставщика.

Требуемая мощность таблицы:

date hits_eventInfo_Category hits_eventInfo_Action session_id user_id hits_time city vendor 

20151021 Air Search 1445001 A232 1952 City1 Vendor1 
20151021 Air Search 1445001 A111 1900 City3 Vendor2 
20151021 Air Search 1445001 A580 1900 City6 Vendor3 

Я пытался сделать это с помощью функции LAG над полем hits_eventInfo_eventLabel после разделения на user_id и упорядоченности по hits_time т.е. LAG(hits_eventInfo_eventLabel,1) OVER(PARTITION BY user_id ORDER BY hits_time)

Однако, поскольку я использую мое отставание смещено как 1, приведенное выше выражение помогает мне получить желаемый результат только для пользователя A232 (поскольку он сделал только 1 поиск, что означает предыдущую запись, прежде чем выбирать поставщика - это, безусловно, поисковая запись).

Есть ли способ, которым я могу сделать это выражение лаги более динамичным, чтобы оно извлекало только ближайшее место поиска, прежде чем делать выбор - независимо от того, сколько поисков было сделано до того, как был сделан выбор?

ИЛИ

Есть ли альтернативная функция/маршрут, который я могу предпринять, чтобы достичь этого?

ответ

1
select 
    date, 
    hits_eventInfo_Category, 
    hits_eventInfo_Action, 
    session_id, 
    user_id, 
    hits_time, 
    prev as city, 
    hits_eventInfo_Label as vendor 
from (
    select *, 
    lag(hits_eventInfo_Label, 1) over(partition by user_id order by hits_time) as prev 
    from dataset.table 
) 
where hits_eventInfo_Action = 'Select' 
Смежные вопросы