2015-09-07 58 views
0

我的输入表计算在蜂巢滞后的样子:通过可变

guest_id days 
101   79 
101   70 
101   68 
101   61 
102   101 
102   90 
102   55 
103   99 
103   90 

需要注意的是,天都按降序排列,通过guest_id

所需的输出表:

guest_id days  days_diff 
101   79  0 
101   70  9 
101   68  2 
101   61  7 
102   101  0 
102   90  11 
102   55  35 
103   99  0 
103   90  9 

days_diff是来自guest_id的第一个订单差异(并非贯穿天数列)

回答

1

您需要有一个独特的id列(否则Hive不知道您的行的顺序)。

然后,你可以自连接上id=id+1,让您的区别:

select a.guest_id, 
     a.days, 
     case when a.guest_id = b.guest_id then b.days-a.days else 0 end days_diff 
from 
input a 
join input b on a.id=b.id-1 

编辑:正如评论所指出的注:Kunal,蜂巢确实有这需要一个PARTITION BY ... ORDER BY子句的滞后窗函数;你仍然需要一些由订购您的表,例如,如果你有一个date列,你会用这个类似如下:

SELECT guest_id, 
     days, 
     LAG(days, 1, 0) OVER (PARTITION BY guest_id ORDER BY date) 
FROM input; 
+0

它是如何照顾一个guest_id中计算的是滞后的区别? –

+0

我想使用以下类型的查询:CREATE TABLE输出AS SELECT gst_i,diff,LAG(diff,1,0)as lag_diff FROM input BY gst_i;这在sql –

+0

中效果很好,据我所知,你不能在配置单元中使用'lag',你必须自己加入。我已经编辑了我的答案,以展示如何使每个访客的第一次滞后等于零 – maxymoo