在SQL(Impala)中,如何计算满足条件的行与下一行之间的时间增量?

时间:2020-02-11 10:42:54

标签: sql impala

我有一个事务数据表,其结构类似于此:

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,但也欢迎使用其他解决方案。

1 个答案:

答案 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()对记录进行编号。