在分析用户行为数据时,"最高同时在线人数"是一个关键指标,它能帮助我们了解系统负载、用户活跃度峰值等重要信息。本篇文章将介绍如何在PowerBI中计算最高同时在线人数及其对应的时间段。
问题描述
为衡量产品的影响力,现在需要计算出最高同时在线人数,以及对应的时间段,请自行建模完成计算。具体问题如下图所示:
本案例的初始数据如下:
登录信息表:
id | login_time | logout_time |
---|---|---|
1001 | 2021/6/14 12:12:00 | 2021/6/14 18:12:00 |
1003 | 2021/6/14 13:12:00 | 2021/6/14 16:12:00 |
1004 | 2021/6/14 13:15:00 | 2021/6/14 20:12:00 |
1002 | 2021/6/14 15:12:00 | 2021/6/14 16:12:00 |
1005 | 2021/6/14 15:18:00 | 2021/6/14 20:12:00 |
1001 | 2021/6/14 20:12:00 | 2021/6/14 23:12:00 |
1006 | 2021/6/14 21:12:00 | 2021/6/14 23:15:00 |
1007 | 2021/6/14 22:12:00 | 2021/6/14 23:10:00 |
若需其它辅助表等,可自行创建并建模。
解题要点
1、本案例的解题思路为:先将用户的各个登录时间段转化为以秒为单位的整数列表,然后按秒进行分组,统计出现次数,然后再找到出现次数最多的秒,最后再对出现次数最多的秒进行范围合并,以及转化为时间即可。
2、对出现次数最多的秒进行范围合并时,其中的分组逻辑可参考下表的分组字段:
Second | Index | Group (Second-Index) |
---|---|---|
10000 | 1 | 9999 |
10001 | 2 | 9999 |
10002 | 3 | 9999 |
10003 | 4 | 9999 |
10008 | 5 | 10003 |
10009 | 6 | 10003 |
10010 | 7 | 10003 |
10020 | 8 | 10012 |
10021 | 9 | 10012 |
解决方案
首先,数据模型如下图所示:
然后,创建如下度量值:
MaxLoginTimeSolt =
VAR BaseNum = 86400*10
VAR Benchmark = MINX(ALL('登录信息表'),'登录信息表'[login_time])*BaseNum
VAR TimeToSecond =
GENERATE(
ALL('登录信息表'),
VAR login_TimeStamp = '登录信息表'[login_time]*BaseNum - Benchmark
VAR logout_TimeStamp = '登录信息表'[logout_time]*BaseNum - Benchmark
RETURN
GENERATESERIES(login_TimeStamp,logout_TimeStamp,1)
)
VAR UserNumOfSecond = GROUPBY(TimeToSecond,[value],"num",SUMX(CURRENTGROUP(),1))
VAR MaxNum = MAXX(UserNumOfSecond,[num])
VAR MaxNumOfSecond = FILTER(UserNumOfSecond,[num]=MaxNum)
VAR GrpOfSecond = ADDCOLUMNS(MaxNumOfSecond,"grp",[value]-RANKX(MaxNumOfSecond,[value],,1))
VAR Period = GROUPBY(GrpOfSecond,[grp],[num],"login",MINX(CURRENTGROUP(),[value]),"logout",MAXX(CURRENTGROUP(),[value]))
VAR SecondToTime =
SELECTCOLUMNS(
Period,
"login_time",([login]+Benchmark)/BaseNum+TIME(0,0,0),
"logout_time",([logout]+Benchmark)/BaseNum+TIME(0,0,0),
"num_login",[num]
)
RETURN
CONCATENATEX(
SecondToTime,
"Login Time: "&FORMAT([login_time],"yyyy/mm/dd hh:nn")&"
Logout Time: "&FORMAT([logout_time],"yyyy/mm/dd hh:nn")&"
MaxLoginNum: "&[num_login],
UNICHAR(10)
)
然后创建一个卡片图,再将上面的度量值放入卡片图的值字段即可,结果如下图所示:
总结
以上方法仅供参考,若有更优雅的解决方案,欢迎留言讨论~