在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()
.
对记录进行编号
我有一个交易数据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()
.