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

In SQL (Impala) how to calculate time delta between rows that satisfies condition and next one?

我有一个交易数据table,其结构类似于:

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

您可以使用 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().

对记录进行编号