SQL(中间表的使用)
创始人
2024-05-31 21:45:04
0

##有时候你需要创造一张中间表来进行业务的计算

1097. 游戏玩法分析 V

Activity 活动记录表

±-------------±--------+
| Column Name | Type |
±-------------±--------+
| player_id | int |
| device_id | int |
| event_date | date |
| games_played | int |
±-------------±--------+
(player_id,event_date)是此表的主键
这张表显示了某些游戏的玩家的活动情况
每一行是一个玩家的记录,他在某一天使用某个设备注销之前登录并玩了很多游戏(可能是 0)

我们将玩家的安装日期定义为该玩家的第一个登录日。

我们还将某个日期 X 的第 1 天保留时间定义为安装日期为 X 的玩家的数量,他们在 X 之后的一天重新登录,除以安装日期为 X 的玩家的数量,四舍五入到小数点后两位。

编写一个 SQL 查询,报告每个安装日期、当天安装游戏的玩家数量和第一天的保留时间。

查询结果格式如下所示:

Activity 表:
±----------±----------±-----------±-------------+
| player_id | device_id | event_date | games_played |
±----------±----------±-----------±-------------+
| 1 | 2 | 2016-03-01 | 5 |
| 1 | 2 | 2016-03-02 | 6 |
| 2 | 3 | 2017-06-25 | 1 |
| 3 | 1 | 2016-03-01 | 0 |
| 3 | 4 | 2016-07-03 | 5 |
±----------±----------±-----------±-------------+

Result 表:
±-----------±---------±---------------+
| install_dt | installs | Day1_retention |
±-----------±---------±---------------+
| 2016-03-01 | 2 | 0.50 |
| 2017-06-25 | 1 | 0.00 |
±-----------±---------±---------------+
玩家 1 和 3 在 2016-03-01 安装了游戏,但只有玩家 1 在 2016-03-02 重新登录,所以 2016-03-01 的第一天保留时间是 1/2=0.50
玩家 2 在 2017-06-25 安装了游戏,但在 2017-06-26 没有重新登录,因此 2017-06-25 的第一天保留为 0/1=0.00

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/game-play-analysis-v
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

1.首先构造一张这样的表

player_idevent_datefirst_dayinternal

这张表的含义: 每一条记录中此用户首次在那天登录, 并且当前登录的时间, 和与首次登录的间隔时间

那么从上表中:通过fisrt_day 分组, 计算 internal = 1 的记录数就是首次登录后,一天剩余的用户数

构造中间表sql

select d.player_id,d.event_date,c.first_day,(d.event_date-c.first_day) internalfrom(select b.player_id,b.event_datefrom Activity b) djoin (select a.player_id,Min(event_date ) first_dayfrom Activity a group by a.player_id) c on d.player_id = c.player_id

2.最终sql

sum(case when e.event_date=e.first_day then 1 else 0 end) 计算在首日登录的人数
sum(e.internal=1) 在first_day登录后一天的人数

select e.first_day install_dt,sum(case when e.event_date=e.first_day then 1 else 0 end) installs,Round(sum(e.internal=1)/sum(case when e.event_date=e.first_day then 1 else 0 end),2) as Day1_retention 
from (select d.player_id,d.event_date,c.first_day,(d.event_date-c.first_day) internalfrom(select b.player_id,b.event_datefrom Activity b) djoin (select a.player_id,Min(event_date ) first_dayfrom Activity a group by a.player_id) c on d.player_id = c.player_id) e
group by e.first_day

相关内容

热门资讯

AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
AWR报告解读 WORKLOAD REPOSITORY PDB report (PDB snapshots) AW...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
Azure构建流程(Power... 这可能是由于配置错误导致的问题。请检查构建流程任务中的“发布构建制品”步骤,确保正确配置了“Arti...
群晖外网访问终极解决方法:IP... 写在前面的话 受够了群晖的quickconnet的小水管了,急需一个新的解决方法&#x...
AWSECS:哪种网络模式具有... 使用AWS ECS中的awsvpc网络模式来获得最佳性能。awsvpc网络模式允许ECS任务直接在V...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...