我有一个事务数据表,其结构类似于此:
User Event TimeStamp
u1 listen_music 2017-10-18 13:28:43
u1 click_btn 2017-10-18 13:28:53
u1 logout 2017-10-18 13:29:55
u2 login 2017-10-19 13:30:20
u2 listen_music 2017-10-19 13:33:25
u2 visit_home 2017-10-19 13:34:10
u2 listen_music 2017-10-19 13:36:15
u2 listen_music 2017-10-19 13:37:35
u2 visit_profile 2017-10-19 13:40:35
我想知道用户听音乐多长时间了。 因此输出将类似于:
User No Delta
u1 1 10 sec
u2 1 45 sec
u2 2 80 sec
u2 3 180 sec
我不想计算所有时间增量,然后过滤到“ listen_music”事件,因为还有许多其他(无关)事件。
所以实际上我想计算满足条件的行与所有用户的下一行之间的时间增量。
我正在使用Impala,但也欢迎使用其他解决方案。
答案 0 :(得分:1)
您可以使用lead()
:
select
user,
row_number() over(partition by user order by timestamp) no,
delta
from (
select
t.*,
unixtimestamp(lead(timestamp) over(partition by user order by timestamp))
- unixtimestamp(timestamp) delta
from mytable t
) t
where event = 'listen_music'
order by user, no;
子查询计算同一用户的当前记录与下一条记录之间的差。外部查询根据目标事件进行过滤,并使用row_number()
对记录进行编号。