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

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

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

其中,“角色id”字段唯一识别玩家。

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

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

玩家在开服首日(2022-08-13)的等级停滞率。

(等级停滞率=停留于该等级角色数/达到过该等级总人数;如玩家没有登出日志,则使用登录日志的等级信息。)

【解题思路】

等级停滞率=停留于该等级角色数/达到过该等级总人数。

各停留等级的角色数在问题2中我们已经计算得出,现在我们来计算达到各等级的总人数。

因为题中表明:如玩家没有登出日志,则使用登录日志的等级信息,因此,我们依然对“登出日志”和“登录日志”纵向联结。

联结后的表记录着玩家全部的角色等级信息,则达到过停留等级的信息必然在该表中,因此我们先计算这个表中达到各个等级的总人数,再筛选出达到停留等级的总人数。

计算达到各个等级的总人数也分为两步:

第一步,对各等级进行分组;

第二步,分组后,计算各等级的角色数。

可以看到,这依然是一个分组汇总问题,使用group by子句组合count()函数进行计算。

需要注意的是:若一个玩家登录登出信息在“登录日志”和“登出日志”都有完整记录。

那么“登出日志”中一次登出时间下的等级,会与“登录日志”中紧随该登出时间后的登录时间下的等级一致,因为登出时的等级会是下一次登录的等级。

这样,联结后的表中同一个玩家不同时间下会存在重复的等级,利用count()函数计算该等级下的人数时就会多算一次该玩家。

这种情况下我们需要对角色id进行去重(使用distinct关键字去重),以免重复计算人数:

count(distinct 角色id)

完整SQL的书写方法:

select 角色等级,count(distinct 角色id) as 总角色数
from
(select 日期,角色id,登录时间 as 时间,角色等级
from 登录日志
where 日期 = '2022-08-13'
union all
select 日期,角色id,登出时间 as 时间,角色等级
from 登出日志
where 日期 = '2022-08-13') as a
group by 角色等级;

查询结果如下:

可以看到,开服首日(2022-08-13)达到各停留等级的总人数均在上述结果中。

现在,我们来筛选达到各停留等级下的总人数。

停留等级来自于问题2计算出的结果中,即下表:

我们需要根据这个表中的停留等级进行筛选,如何筛选呢?

可以使用left join联结进行筛选。

left join用于横向联结两个表,联结时以左表为主表,返回左表的所有行,即使右表中没有匹配。

在这里,我们将上述停留等级分布的表(设为临时表c)设为左表,包含所有角色等级下的总角色数的表(设为临时表d)设为右表。

左、右表以等级进行匹配,那么使用left join纵向联结左、右表后,只会保留左表中存在的角色等级,而剔除掉左表中不存在的角色等级。

这样,我们就能将表d中的属于停留等级的总角色数筛选出来。

实现上述联结的SQL的书写方法:

select c.*,d.*
from c
left join d
on c.停留等级 = d.角色等级;

可以看到,使用left join联结后的表已经同时存在停留于该等级的角色数、达到过该等级的总人数(总角色数),可以直接算出等级停滞率(角色数/总角色数即为等级停滞率)。

那么,我们在用left join联结后,直接取表c中的停留等级,并取表c中的角色数,表d中的总角色数相除即可,无需将表c和表d中所有列都取出来。

SQL的书写方法:

select c.停留等级,c.角色数/d.总角色数 as 等级停滞率
from c
left join d
on c.停留等级 = d.角色等级;

现在我们来带入临时表c、临时表d的内容。为了使SQL语句更加易读,我们使用with…as语句来定义临时表c、临时表d(with…as语句可以将一组完整SQL语句的子查询封装起来,使语句更加清晰易懂)。

临时表c为问题2的查询结果,临时表d为计算达到各等级的总人数的查询结果,则有:

with
c as(
select 角色等级 as 停留等级,count(角色id) as 角色数
from
(select *,rank() over(partition by 角色id order by 时间 desc ) as 排名
from
(select 日期,角色id,登录时间 as 时间,角色等级
from 登录日志
where 日期 = '2022-08-13'
union all
select 日期,角色id,登出时间 as 时间,角色等级
from 登出日志
where 日期 = '2022-08-13') as a
) as b
where 排名 = 1
group by 角色等级
order by 角色等级 asc), #临时表c的具体内容
d as(
select 角色等级,count(distinct 角色id) as 总角色数
from
(select 日期,角色id,登录时间 as 时间,角色等级
from 登录日志
where 日期 = '2022-08-13'
union all
select 日期,角色id,登出时间 as 时间,角色等级
from 登出日志
where 日期 = '2022-08-13') as a
group by 角色等级) #临时表d的具体内容

将其带入left join联结的语句中,则计算各停留等级的停滞率的完整SQL的书写方法为:

with
c as(
select 角色等级 as 停留等级,count(角色id) as 角色数
from
(select *,rank() over(partition by 角色id order by 时间 desc ) as 排名
from
(select 日期,角色id,登录时间 as 时间,角色等级
from 登录日志
where 日期 = '2022-08-13'
union all
select 日期,角色id,登出时间 as 时间,角色等级
from 登出日志
where 日期 = '2022-08-13') as a
) as b
where 排名 = 1
group by 角色等级
order by 角色等级 asc), #临时表c的具体内容
d as(
select 角色等级,count(distinct 角色id) as 总角色数
from
(select 日期,角色id,登录时间 as 时间,角色等级
from 登录日志
where 日期 = '2022-08-13'
union all
select 日期,角色id,登出时间 as 时间,角色等级
from 登出日志
where 日期 = '2022-08-13') as a
group by 角色等级) #临时表d的具体内容
select c.停留等级,c.角色数/d.总角色数 as 等级停滞率
from c
left join d
on c.停留等级 = d.角色等级;

查询结果如下:

案例数据下载途径:

 ⬇️点击「阅读原文」

 免费报名 数据分析训练营

todo游戏行业实战案例3:玩家等级停滞率相关推荐

  1. SQL游戏行业实战案例2:玩家等级(union、分组、排序)

    [面试题]某游戏数据后台设有"登录日志"和"登出日志"两张表. "登录日志"记录各玩家的登录时间和登录时的角色等级. 其中,"角色 ...

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

    [面试题]某游戏数据后台设有"登录日志"和"登出日志"两张表. "登录日志"记录各玩家的登录时间和登录时的角色等级. "登出日志& ...

  3. 4大行业实战案例,深度解析数字化转型升级路径

    ​本篇文章为亿信华辰<4大行业实战案例,深度解析数字化转型升级路径>视频直播稿件. 大家晚上好,欢迎来到小亿直播间!今天主讲的内容是以4个行业的典型应用为背景,给大家讲讲数字化转型的项目是 ...

  4. python编写一个弹球游戏_Python实战案例:用Python写一个弹球游戏,就是这么强

    我们前面讲了几篇关于类的知识点,为了让大家更好的掌握类的概念,并灵活的运用这些知识,我写了一个有趣又好玩的弹球的游戏,一来可以把类的知识融会一下,二来加深对Python的兴趣.你会发现哎呀Python ...

  5. 2018上半年游戏行业DDoS态势报告

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯游戏云发表于云+社区专栏 0x0 前言 最新发布的2018全球游戏市场报告指出,2018年全球的游戏玩家数达到23亿,他们在游戏上 ...

  6. 游戏行业的发展前景有什么看法

    2022年其实对于任何行业的挑战其实都是很大的,游戏行业也是如此.但往往机遇也是从挑战中诞生的.接下来我将从多个方面来分析游戏行业的发展前景并且给你一些前期准备的建议,希望可以帮到题主. 首先我们从大 ...

  7. 跟一夫学UI设计 APPUI综合设计与图标实战案例视频教程 photoshop绘制icon案例-王诚-专题视频课程...

    跟一夫学UI设计 APPUI综合设计与图标实战案例视频教程 photoshop绘制icon案例-651人已学习 课程介绍         跟一夫学UI设计 APPUI图标设计实战案例视频教程 phot ...

  8. 2018上半年游戏行业DDoS态势报告 1

    2018上半年游戏行业DDoS态势报告 欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯游戏云发表于云+社区专栏 0x0 前言 最新发布的2018全球游戏市场报告指出,2018年 ...

  9. 腾讯云2018上半年游戏行业DDoS态势报告,实用干货!

    前言 最新发布的2018全球游戏市场报告指出,2018年全球的游戏玩家数达到23亿,他们在游戏上花费将达到1379亿美元,其中中国游戏市场规模将达到379亿美元,占全球游戏市场收入的25%以上,中国市 ...

  10. 基础爬虫实战案例之获取游戏商品数据

    文章目录 前言 一.爬虫是什么? 二.爬虫实战案例 1.引入库 2.请求网页处理 3.生成访问链接 4.读入数据到mongodb 5.获得数据 6.加入多线程 总结 前言 在想获取网站的一些数据时,能 ...

最新文章

  1. Google帮助IE浏览器实现对SVG支持
  2. 沫沫金Echarts移动端demo
  3. niceyoo的2020年终总结-2021年Flag
  4. python做带数据库的登录界面_Python3 Tkinkter + SQLite实现登录和注册界面
  5. 线上分享|云和恩墨大讲堂201902:MySQL基础之体系结构
  6. 鸿蒙撕系统裂安卓阵营,鸿蒙系统年底问世 安卓阵营是不是该瑟瑟发抖了
  7. 各大搜索引擎提交地址
  8. jQuery判断checked的三种方法
  9. Python 文件路径过深找不到文件
  10. 计算机系统还原到某个时间节点,电脑恢复到某个时间点
  11. 微信公众平台 客服接口-发消息
  12. 国家级非遗传承人高清旺《四大美人》皮影数字藏品惊艳亮相!
  13. [RK3588 Android12]删除谷歌搜索框
  14. linux strcpy函数,C语言中函数strcpy ,strncpy ,strlcpy,strcpy_s的用法
  15. 关于WIN10系统无法打开CHM文件
  16. for和while循环
  17. Python做双均线策略
  18. 山外山科创板上市破发:首日下挫19% 公司市值38亿
  19. windows编译libzip vs2017
  20. 关于我的家乡html网页设计完整版,10个以家乡为主题的网页设计与实现

热门文章

  1. FontLab VI(字体制作软件)v6.1.4.7043中文版
  2. 如何给计算机d盘加密码,怎样给电脑文件夹加密
  3. 英文数字验证码识别包
  4. 《紫川》之远东战火 十一卷
  5. 泰坦尼克号幸存者预测
  6. 机械臂技术参数的意义
  7. 如何连接新浪sae共享数据库
  8. cf手游服务器连接中断,CF手游服务器连接失败怎么回事 无法连接服务器
  9. 监控工具Zabbix之原理及部署
  10. 蓝牙技术|伦茨科技智能语音遥控器方案简介