2015-03-31 6 views
0

Это мои данные таблицы:Как получить последнее совещание подряд определенное состояние

sessionid | page | category | productid | time 
1   | detail | 3  | 4   | 20150303 1002 
1   | cart | null  | 4   | 20150303 1003 
2   | detail | 5  | 3   | 20150303 1005 
2   | detail | 5  | 3   | 20150303 1007 
2   | detail | null  | 2   | 20150303 1008 
2   | cart | null  | 3   | 20150303 1010 
2   | detail | 1  | 3   | 20150303 1013 

Это мой ожидаемого результат

sessionid | page | category | productid | time   | refercategory 
1   | cart | null | 4   | 20150303 1003 | 3 
2   | cart | null | 3   | 20150303 1010 | 5 

В основном я хочу смотреть на только корзину событиях, и возьмите поле категории из самой последней строки подробностей до события, которая имеет значение, отличное от нулевой категории, и тот же productid.

Итак, для последнего события корзины с sessionid = 2 я бы поднялся до тех пор, пока не нажмет на страницу подробных сведений с таким же sessionid (= 2), что и productid (= 3) и значение, отличное от нулевой категории (= 5).

Я попытался подключиться (но не мог ограничить один результат) и задержкой (но не смог правильно фильтровать страницы). Я был бы признателен за любые советы относительно этой запутанной проблемы. Благодаря!

ответ

1

Я не знаком с hive/hiveql, поэтому я отвечу на общий SQL.

select t1.sessionid, t1.page, t1.category, t1.productid, t1.time, t2.category as refercategory 
from table1 as t1 
join table1 as t2 on t1.sessionid = t2.sessionid and t1.productid = t2.productid 
where t1.page = 'cart' 
and t2.time = (select max(time) 
       from table1 as t3 
       where t3.sessionid = t2.sessionid and category is not null) 

Вот результат с помощью тестовых данных:

sessionid page category productid time   refercategory 
1   cart (null)   4  20150303 1003 3 
2   cart (null)   3  20150303 1010 5 

Вот скрипка, показывая его работать: http://sqlfiddle.com/#!9/38f7b0/4


EDIT Чтобы соответствовать пересмотренному вопросу/I данных пересмотрел запрос до:

select t1.sessionid, t1.page, t1.category, t1.productid, t1.time, t2.category as refercategory 
from table1 as t1 
join table1 as t2 on t1.sessionid = t2.sessionid and t1.productid = t2.productid 
where t1.page = 'cart' 
and t2.time = (select max(time) 
       from table1 as t3 
       where t3.sessionid = t2.sessionid 
       and category is not null 
       and t3.time <= t1.time) 

Единственное изменение - это добавление and t3.time <= t1.time, чтобы гарантировать, что время на выбранной строке реферирования меньше, чем строка корзины.

Вот новая скрипка: http://sqlfiddle.com/#!9/a08ed/3

+0

Привет спасибо за вашу помощь! Здесь, как я могу убедиться, что я вытаскиваю детальную строку, которая произошла «до» в событии тележки? – magu2

+0

Чтобы уточнить, я отредактировал категорию и время в последней строке. Теперь ваша скрипка тянет 1 как refercategory, а не 5, я намеревался .. – magu2

+0

Спасибо! Это отлично работает в SQL. Я думаю, что единственная проблема заключается в том, что Hive doen't позволяет мне использовать подзапрос после t2.time =(). Любые обходные пути? – magu2

Смежные вопросы