游戏行业实战案例 5 :玩家在线分布

这篇具有很好参考价值的文章主要介绍了游戏行业实战案例 5 :玩家在线分布。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

游戏行业实战案例 5 :玩家在线分布,游戏,java,开发语言

【面试题】某游戏数据后台设有“登录日志”和“登出日志”两张表。

「登录日志」记录各玩家的登录时间和登录时的角色等级。 

游戏行业实战案例 5 :玩家在线分布,游戏,java,开发语言

「登出日志」记录各玩家的登出时间和登出时的角色等级。

游戏行业实战案例 5 :玩家在线分布,游戏,java,开发语言

其中,「角色 id 」字段唯一识别玩家。

游戏开服前两天( 2022-08-13 至 2022-08-14 )的角色登录和登出日志如下

游戏行业实战案例 5 :玩家在线分布,游戏,java,开发语言

游戏行业实战案例 5 :玩家在线分布,游戏,java,开发语言

一天中,玩家可以多次登录登出游戏,请使用 SQL 分析出以下业务问题:

请根据玩家登录登出的时间,统计在开服首日各玩家在线时长分布。

(如玩家登录后没有对应的登出日志,可以使用当天 23:59:59 作为登出时间,时间之间的计算可以考虑使用时间戳函数 unix_timestamp 。【区分在线时间段:0-30min ,30min-1h ,1-2h ,2-3h ,3-5h ,5h 以上;区间为左闭右开】)

问题 5 :

统计在开服首日各玩家在线时长分布,其中区分在线时间段:0-30min ,30min-1h ,1-2h ,2-3h ,3-5h ,5h 以上,区间为左闭右开,解释为大白话即为:统计2022-08-13,在线时间段在 0-30min 、30min-1h 、1-2h 、 2-3h 、3-5h 、5h 以上的玩家各有多少人。

统计人数使用 count() 函数,而玩家的在线时间段可以用 case when 子句进行条件判断,即使用 case when 子句判断各玩家的总在线时长在哪个在线时间段内:

case when 总在线时长_min>=0 and 总在线时长_min<30 then '0-30min'
when 总在线时长_min>=30 and 总在线时长_min<60 then '30min-1h'
when 总在线时长_min>=60 and 总在线时长_min<120 then '1-2h'
when 总在线时长_min>=120 and 总在线时长_min<180 then '2-3h'
when 总在线时长_min>=180 and 总在线时长_min<300 then '3-5h'
else '5h以上' end

将问题 4 中统计各玩家每天的总在线时长的查询结果设为临时表 d ,则判断开服首日,各玩家的总在线时长在哪个在线时间段内的 SQL 的书写方法:

select 角色id,
       (case when 总在线时长_min>=0 and 总在线时长_min<30 then '0-30min'
        when 总在线时长_min>=30 and 总在线时长_min<60 then '30min-1h'
        when 总在线时长_min>=60 and 总在线时长_min<120 then '1-2h'
        when 总在线时长_min>=120 and 总在线时长_min<180 then '2-3h'
        when 总在线时长_min>=180 and 总在线时长_min<300 then '3-5h'
        else '5h以上' end) as 在线时间段
from d
where 日期 = '2022-08-13';

利用 with…as 语句来封装临时表 d 的查询语句,则 SQL 的书写方法:

with d as
(with c as
(select a.角色id,a.日期,a.登录时间,
        (case when b.登出时间 is null then concat(a.日期,'23:59:59') else b.登出时间 end) as 登出时间
from
(select 角色id,日期,登录时间,rank() over(partition by 角色id,日期 order by 登录时间 asc) as 登录排名
from 登录日志) as a
left join
(select 角色id,日期,登出时间,rank() over(partition by 角色id,日期 order by 登出时间 asc) as 登出排名
from 登出日志) as b
on a.角色id = b.角色id and a.日期 = b.日期 and a.登录排名 = b.登出排名
)
select 角色id,日期,
sum(round((unix_timestamp(登出时间)- unix_timestamp(登录时间))/60,2)) as 总在线时长_min
from c
group by 角色id,日期
)
select 角色id,
       (case when 总在线时长_min>=0 and 总在线时长_min<30 then '0-30min'
        when 总在线时长_min>=30 and 总在线时长_min<60 then '30min-1h'
        when 总在线时长_min>=60 and 总在线时长_min<120 then '1-2h'
        when 总在线时长_min>=120 and 总在线时长_min<180 then '2-3h'
        when 总在线时长_min>=180 and 总在线时长_min<300 then '3-5h'
        else '5h以上' end) as 在线时间段
from d
where 日期 = '2022-08-13';

查询结果如下:

游戏行业实战案例 5 :玩家在线分布,游戏,java,开发语言

现在我们来计算各在线时间段的玩家人数,同样,使用 group by 子句和 count() 函数即可实现。

将上述查询结果设为临时表 e ,则 SQL 的书写方法:

select 在线时间段,count(角色id) as 玩家人数
from e
group by 在线时间段;

将临时表 e 的查询语句代入,则 SQL 的书写方法:

with d as
(with c as
(select a.角色id,a.日期,a.登录时间,
        (case when b.登出时间 is null then concat(a.日期,'23:59:59') else b.登出时间 end) as 登出时间
from
(select 角色id,日期,登录时间,rank() over(partition by 角色id,日期 order by 登录时间 asc) as 登录排名
from 登录日志) as a
left join
(select 角色id,日期,登出时间,rank() over(partition by 角色id,日期 order by 登出时间 asc) as 登出排名
from 登出日志) as b
on a.角色id = b.角色id and a.日期 = b.日期 and a.登录排名 = b.登出排名
)
select 角色id,日期,
sum(round((unix_timestamp(登出时间)- unix_timestamp(登录时间))/60,2)) as 总在线时长_min
from c
group by 角色id,日期
)
select 在线时间段,count(角色id) as 玩家人数
from
(select 角色id,
       (case when 总在线时长_min>=0 and 总在线时长_min<30 then '0-30min'
        when 总在线时长_min>=30 and 总在线时长_min<60 then '30min-1h'
        when 总在线时长_min>=60 and 总在线时长_min<120 then '1-2h'
        when 总在线时长_min>=120 and 总在线时长_min<180 then '2-3h'
        when 总在线时长_min>=180 and 总在线时长_min<300 then '3-5h'
        else '5h以上' end) as 在线时间段
from d
where 日期 = '2022-08-13'
) as e
group by 在线时间段;

查询结果如下:

游戏行业实战案例 5 :玩家在线分布,游戏,java,开发语言

可以看到,虽然我们已经得到了各在线时间段的玩家人数,但是在线时间段的排列是乱序的,查看分布情况不是很方便。因此,我们需要对在线时间段进行重新排序。

「在线时间段」这一列数据类型为字符串,无法用 order by 子句进行简单排序,那么如何对在线时间段进行重新排序呢?

可以使用 field() 函数。field() 函数是自定义排序函数,可以自定义排列顺序,使用方法为:

order by field(值,str1,str2,str3,str4,……,strn) asc/desc

意思为:

将值按照 str1 , str2 , str3 , str4 ,……, strn 的顺序升序(asc)或者降序排列(desc)。

将其应用在本问题中,则为:

order by field(在线时间段,'0-30min','30min-1h','1-2h','2-3h','3-5h','5h以上') asc

即:将在线时间段这一列的值按照 '0-30min' , '30min-1h' , '1-2h' , '2-3h' , '3-5h' , '5h以上' 的顺序升序排列。

将其代入上述 SQL 语句中,则统计开服首日,玩家的在线时长分布的完整 SQL 的书写方法为:

with d as
(with c as
(select a.角色id,a.日期,a.登录时间,
        (case when b.登出时间 is null then concat(a.日期,'23:59:59') else b.登出时间 end) as 登出时间
from
(select 角色id,日期,登录时间,rank() over(partition by 角色id,日期 order by 登录时间 asc) as 登录排名
from 登录日志) as a
left join
(select 角色id,日期,登出时间,rank() over(partition by 角色id,日期 order by 登出时间 asc) as 登出排名
from 登出日志) as b
on a.角色id = b.角色id and a.日期 = b.日期 and a.登录排名 = b.登出排名
)
select 角色id,日期,
sum(round((unix_timestamp(登出时间)- unix_timestamp(登录时间))/60,2)) as 总在线时长_min
from c
group by 角色id,日期
)
select 在线时间段,count(角色id) as 玩家人数
from
(select 角色id,
       (case when 总在线时长_min>=0 and 总在线时长_min<30 then '0-30min'
        when 总在线时长_min>=30 and 总在线时长_min<60 then '30min-1h'
        when 总在线时长_min>=60 and 总在线时长_min<120 then '1-2h'
        when 总在线时长_min>=120 and 总在线时长_min<180 then '2-3h'
        when 总在线时长_min>=180 and 总在线时长_min<300 then '3-5h'
        else '5h以上' end) as 在线时间段
from d
where 日期 = '2022-08-13'
) as e
group by 在线时间段
order by field(在线时间段,'0-30min','30min-1h','1-2h','2-3h','3-5h','5h以上') asc;

查询结果如下:

游戏行业实战案例 5 :玩家在线分布,游戏,java,开发语言

【本题考点】

1、考察逻辑分析能力,即:如何将复杂问题拆解成容易解决的一个个子问题的能力;

2、考察排序窗口函数的灵活使用。在需要进行分组排序时,排序窗口函数往往是首选;

3、考察 case when 语句的灵活应用以及分组汇总时,group by 子句、聚合函数的搭配使用;

4、考察纵向联结和横向联结的使用。纵向联结使用 union 方法(union、union all),横向联结使用 join 方法(left join、innerjoin、right join);

5、考察多重子查询的应用以及 with…as 语句的应用。

游戏行业实战案例 5 :玩家在线分布,游戏,java,开发语言

 ⬇️点击「阅读原文」

 免费报名 数据分析训练营文章来源地址https://www.toymoban.com/news/detail-645139.html

到了这里,关于游戏行业实战案例 5 :玩家在线分布的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity与C++网络游戏开发实战:基于VR、AI与分布式架构 【1.6】

    3.8 Unity中使用协程         协程是在Unity中经常使用的一种辅助处理模式。比如,我们需要设计一个人一边走动一边去观察周围的情况,走动和观察这两种运动同时进行。这时我们可以使用多线程来处理这个问题,但是多线程在内存和CPU的调度时间上具有一些风险。此时在

    2024年04月10日
    浏览(47)
  • 1+X 云计算运维与开发(中级)案例实战——Zabbix分布式监控系统

    学而不思则罔,思而不学则殆。 IP 主机名 节点 192.168.200.10/24 zabbix-server Server节点 192.168.200.20/24 zabbix-agent Agent节点 这个实验非常简单,就是最基本的配置yum源,安装,修改配置文件,启动,然后在图形化界面操作。 1.配置yum源 2.安装服务 [ server节点 : lamp+zabbix-server] [ agent节点

    2024年02月04日
    浏览(57)
  • 1+X 云计算运维与开发(中级)案例实战——分布式部署集群应用商城系统

    学而不思则罔,思而不学则殆。 IP 主机名 节点 192.168.200.10 mycat Mycat 中间件服务节点 192.168.200.20 db1 MariaDB 数据库集群主节点 192.168.200.30 db2 MariaDB 数据库集群从节点 192.168.200.40 zookeeper1 集群节点 192.168.200.50 zookeeper2 集群节点 192.168.200.60 zookeeper3 集群节点 192.168.200.70 redis 消息队

    2023年04月23日
    浏览(70)
  • 实战案例 - 医疗行业攻击面发现及管理

    医院委托第三方安全公司进行渗透测试 公网域名发现 HIS 系统,通过域名访问并进行入侵 植入木马后,被 HIDS 发现并处置 通过 HIDS 发现 HIS 系统存在已知安全漏洞 通报院方负责人进行处理 院方负责人 仅关闭对应系统域名解析 HW 演练时,攻击队通过 历史域名解析发现公网

    2024年01月16日
    浏览(36)
  • 从0到1开发go-tcp框架【4实战片— — 开发MMO之玩家聊天篇】

    MMO(MassiveMultiplayerOnlineGame):大型多人在线游戏(多人在线网游) 游戏中的坐标模型: 场景相关数值计算 ● 场景大小: 250*250 , w(x轴宽度) = 250,l(y轴长度) = 250 ● x轴格子数量:nx = 5 ● y轴格子数量:ny = 5 ● 格子宽度: dx = w / nx = 250 / 5 = 50 ● 格子长度: dy = l / ny = 250 / 5

    2024年02月13日
    浏览(40)
  • 游戏玩家的新大陆?小红书游戏内容场景洞察

    2023年,如果你问年轻人他们在哪里讨论游戏?他们可能会提到一些平台,比如Steam、TapTap、B站、微博或者论坛。但是如果你向身边的女孩子询问,她们可能会惊喜地告诉你:小红书。 小红书平台一直给人的标签是是“美妆、旅游、美食分享”,但在现在的小红书生态里,“

    2024年02月09日
    浏览(48)
  • Axure在线购物商城小程序原型图,抖音商城垂直电商APP实战案例

    页面数量:共 60+ 页 兼容软件:Axure RP 9/10,不支持低版本 应用领域:品牌自营商城、垂直电商、短视频社区商城 作品申明:页面内容仅用于功能演示,无实际功能 本作品为品牌自营在线商城小程序的原型图,属于垂直电商解决方案(以某药业为例);目前已实现功能包括:

    2024年02月02日
    浏览(38)
  • (四)库存超卖案例实战——优化redis分布式锁

    在上一节内容中,我们已经实现了使用redis分布式锁解决商品“超卖”的问题,本节内容是对redis分布式锁的优化。在上一节的redis分布式锁中,我们的锁有俩个可以优化的问题。第一,锁需要实现可重入,同一个线程不用重复去获取锁;第二,锁没有续期功能,导致业务没有

    2024年02月07日
    浏览(45)
  • Web3 游戏全景图:各类玩家群像解读

    作者:lesley@footprint.network 主要观点 即使市场深陷寒冬,但 web3 游戏每天依然有八十万的用户。 Web3 游戏正在逐步完善,从 DeFi 演变出的 Web3 游戏 ,到增强了叙事的 X2E,再到 AAA 游戏和元宇宙。 未来,Web3 游戏需要共识和更多优质项目来共建行业生态系统。 加密市场在逐渐回

    2024年02月02日
    浏览(42)
  • Steam热门游戏遭破解,玩家需警惕安全风险

    近日,热门策略游戏《Slay the Spire》的扩展版本《Downfall》被黑客入侵。他们利用 Steam 更新系统向玩家推送了 Epsilon 信息窃取恶意软件。 开发者 Michael Mayhem 表示:被入侵的软件包是原游戏的预包装独立修改版,并非通过 Steam Workshop 安装的修改版。 最开始是其中一台设备被恶

    2024年02月03日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包