如何检索满足特定条件的最新行

时间:2015-03-31 05:25:29

标签: sql hive hiveql

这是我的数据表:

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>

我尝试加入(但不能限制为一个结果)和滞后(但无法正确过滤页面)。我很感激有关这个令人困惑的问题的任何提示。谢谢!

1 个答案:

答案 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