我正在学习使用SQL Server 2016 Express的SQL。我正在构建一个应用程序,并使用数据库来监视用户活动。对于每个按钮,单击“ activity_type
”和“ CURRENT_TIMESTAMP
”记录日期时间。
SELECT activity_type, occurred_at
FROM user_activity
这将返回以下示例数据
activity_type occurred_at
------------------- ----------------------
LogIn 3/7/2019 9:27:58 AM
Action1 3/7/2019 9:27:59 AM
Action2 3/7/2019 9:28:00 AM
LogOut 3/7/2019 9:28:01 AM
LogIn 3/7/2019 9:28:02 AM
LogIn 3/7/2019 9:28:04 AM
我想计算每次登录和注销之间活动的总时间。可能根本不需要注销活动。我可以将任何登录之前的上一次活动视为退出时间。
我期望的答案是第一次登录和Action2之间的时间,第二次和第三次登录之间的时间为0,并且两者之间没有活动。
关于如何解决此问题的任何想法?谢谢!
最新答案:
@Gordon提供的答案奏效了
结果是:
Column1 Column2 dur_seconds
--------------------- --------------------- -------------
03/07/2019 09:27:58 03/07/2019 09:28:00 2
03/07/2019 09:28:06 03/07/2019 09:28:06 0
03/07/2019 09:28:08 03/07/2019 09:28:08 0
03/07/2019 10:28:12 03/07/2019 10:28:12 0
03/07/2019 10:38:55 03/07/2019 10:38:55 0
03/07/2019 10:40:09 03/07/2019 10:40:09 0
03/07/2019 10:40:46 03/07/2019 10:40:46 0
03/07/2019 10:42:23 03/07/2019 10:49:28 425
03/07/2019 10:51:15 03/07/2019 10:57:49 394
03/07/2019 10:57:55 03/07/2019 10:59:02 67
答案 0 :(得分:0)
这很棘手。您想使用group by
,但没有分组列。因此,您可以创建一个-通过计算每个记录的登录记录数。
然后:
select min(occurred_at), max(occurred_at),
datediff(second, min(occurred_at), max(occurred_at)) as dur_seconds
from (select t.*,
sum(case when activity_type = 'LogIn' then 1 else 0 end) over (order by occurred_at) as grp
from t
) t
where activity_type <> 'LogOut'
group by grp;