很明显,这些数据时间上是有重叠的,例如user1在08:30~10:30这个时间段内用三个web端和一个app端登录,但他的时长应该只能算作2个小时
要正确统计,我们需要三步:
获取用户的重叠时间段中最早的起始时间
获取用户的重叠时间段中最晚的结束时间
前两步的起始时间与结束时间合并,得到综合的时间段,再进行统计
第一步:
查询用户名、起始时间
其中起始时间需要满足的条件是:不包含于其它时间段,即不存在一条记录来满足条件“s>start且s<=end”
得到的结果可能存在重复,所以用distinct去重
这样找到的s就是用户重叠时间段的最早时间。如下
select distinct usr,start
from user_sessions as a
where not exists
(select * from user_sessions as b where a.usr=b.usr and a.start>b.start and a.start<=b.end);
第二步:
查询用户名、结束时间
这步于第一步一样道理,结束时间满足的条件是:不包含于其它时间段,即不存在一条记录满足“e>=start且e<end”
结果如下:
select distinct usr,end
from user_sessions as a
where not exists
(select * from user_sessions as b where