会话化有点棘手。让我告诉你如何做到这一点。或许这将解决您的问题:
select userid, min(log_date) as session_start,
dateadd(minute, 30, max(log_date)) as session_end,
row_number() over() as session_id
from (select l.*,
sum(case when log_date < dateadd(minute, 30, prev_logdate)
then 0 else 1
end) over (partition by userid order by logdate
) as grp
from (select l.*,
lag(logdate) over (partition by userid order by logdate) as prev_logdate
from ActivityDatabase.dbo.Logs l
) l
) l
group by userid, grp;
如果你想在给定时间点唯一用户数,则:
with s as (
select userid, min(log_date) as session_start,
dateadd(minute, 30, max(log_date) as session_end,
row_number() over() as session_id
from (select l.*,
sum(case when log_date < dateadd(minute, 30, prev_logdate)
then 0 else 1
end) over (partition by userid order by logdate
) as grp
from (select l.*,
lag(logdate) over (partition by userid order by logdate) as prev_logdate
from ActivityDatabase.dbo.Logs l
) l
) l
group by userid, grp
)
select count(*)
from s
where @datetime between session_start and session_end;
更强力的替代给定的时间是:
select count(distinct userid)
from ActivityDatabase.dbo.Logs l
where @datetime between log_date and dateadd(minute, 30, log_date);
如果应用程序正在调用查询,则可能更容易获取记录,按日期排序并使用应用程序代码来识别会话。 –