这是我的数据表:
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
基本上我只想查看购物车事件,并从事件之前的最新详细信息行中获取类别字段,该字段具有非null类别值和相同的productid。
因此,对于sessionid = 2的最后一个购物车事件,我会一直走到具有相同sessionid(= 2),同一productid(= 3)和非null类别值(= 5)的详细信息页面。< / p>
我尝试加入(但不能限制为一个结果)和滞后(但无法正确过滤页面)。我很感激有关这个令人困惑的问题的任何提示。谢谢!
答案 0 :(得分: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
编辑为了匹配修改后的问题/数据,我将查询修改为:
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