【发布时间】:2020-01-02 14:11:25
【问题描述】:
输入:
company_id description timestamp user_id
1 logged in 2019-08-26 06:37:16 1
1 logged out 2019-08-26 06:39:16 1
1 logged in 2019-08-26 06:39:16 2
1 logged out 2019-08-26 07:37:16 2
在redshift中,我想得到diff((logged-in)-(logged-out))
预期输出
company_id description timestamp user_id diff(seconds)
1 logged in 2019-08-26 06:37:16 1 120
1 logged out 2019-08-26 06:39:16 1 NULL
1 logged in 2019-08-26 06:39:16 2 100000
1 logged out 2019-08-26 07:37:16 2 Null
我试过了,但无法得到预期的结果:
用于查找登录和注销之间差异的 Redshift 查询不起作用
select
timestamp, LogStartTime, LoginEndTime
, Total_Time = right(concat('0', Total_Time / 3600), 2) + ':' + right(concat('0', Total_Time % 3600 / 60), 2) + ':' + right(concat('0', Total_Time % 60), 2)
, OnFloor = right(concat('0', OnFloor / 3600), 2) + ':' + right(concat('0', OnFloor % 3600 / 60), 2) + ':' + right(concat('0', OnFloor % 60), 2)
, OffFloor = right(concat('0', OffFloor / 3600), 2) + ':' + right(concat('0', OffFloor % 3600 / 60), 2) + ':' + right(concat('0', OffFloor % 60), 2)
, user_id
from (
select
user_id, timestamp = cast(min(timestamp) as date)
, LogStartTime = min(timestamp)
, LoginEndTime = max(timestamp)
, Total_Time = sum(ss)
, OnFloor = sum(iif(rtrim(ltrim(description)) = 'logged in', ss, 0))
, OffFloor = sum(iif(rtrim(ltrim(description)) = 'logged out', ss, 0))
from (
select
*,ss = datediff(ss,timestamp,lead(timestamp) over (partition by user_id, order by timestamp))
from (
select
*, grp = sum(diff) over (partition by user_id order by timestamp)
from (
select
*, diff = iif(datediff(mi, lag(timestamp) over (partition by user_id order by timestamp), timestamp) > 300 and description = 'logged in', 1, 0)
from
webactivities_9hmg8q
) t
) t
) t
group by user_id, grp
) t
company_id description timestamp user_id diff(seconds)
1 logged in 2019-08-26 06:37:16 1 120
1 logged out 2019-08-26 06:39:16 1 NULL
1 logged in 2019-08-26 06:39:16 2 100000
1 logged out 2019-08-26 07:37:16 2 Null
【问题讨论】:
标签: sql amazon-redshift