1097. Game Play Analysis V 难度:困难

1、题目描述

We define the install date of a player to be the first login day of that player.
We also define day 1 retention of some date X to be the number of players whose install date is X and they logged back in on the day right after X, divided by the number of players whose install date is X, rounded to 2 decimal places.
Write an SQL query that reports for each install date, the number of players that installed the game on that day and the day 1 retention.
The query result format is in the following example:
Activity table:

player_iddevice_idevent_dategames_played
122016-03-015
122016-03-026
232017-06-251
312016-03-010
342016-07-035

Result table:

install_dtinstallsDay1_retention
2016-03-0120.50
2017-06-2510.00

Player 1 and 3 installed the game on 2016-03-01 but only player 1 logged back in on 2016-03-02 so the day 1 retention of 2016-03-01 is 1 / 2 = 0.50
Player 2 installed the game on 2017-06-25 but didn’t log back in on 2017-06-26 so the day 1 retention of 2017-06-25 is 0 / 1 = 0.00

来源:力扣(LeetCode)

2、解题思路

这一题,难度在于两个比较值‘安装日期’和‘第1天留存’,‘安装日期’可以直接按日期统计,但是‘第1天留存’必须先按玩家统计,然后转换成日期统计。
1# 首先‘安装’日期比较简单,直接进行count(player_id) as installs,但是注意要先进行排序order by player_id,event_date

select event_date as install_dt,count(player_id) as installs  
from

(select  player_id,event_date
from Activity
group by player_id
order by player_id,event_date)a 

group by event_date

2# ‘第1天留存’,两表联查,取日期差为1,datediff(a2.event_date,a1.event_date)=1

select a1.event_date,count(a1.player_id) as jude
from Activity a1,Activity a2
where a1.player_id=a2.player_id and datediff(a2.event_date,a1.event_date)=1
group by a1.event_date

3# 2表联查,注意空置处理ifnull(jude,0)

3、提交记录

select install_dt,installs,round(ifnull(jude,0)/installs,2) as Day1_retention
from (
    
select event_date as install_dt,count(player_id) as installs  
from
(select  player_id,event_date
from Activity
group by player_id
order by player_id,event_date)a 
group by event_date)c

left join

 (select a1.event_date,count(a1.player_id) as jude
from Activity a1,Activity a2
where a1.player_id=a2.player_id and datediff(a2.event_date,a1.event_date)=1
group by a1.event_date)b

on c.install_dt=b.event_date
group by install_dt
order by install_dt
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值