前言:
- 本篇进阶练习题均来自真实的业务需求场景,SQL难度不高,但要求较为清晰的业务逻辑和对游戏项目的深入了解。
- 如果对于SQL不熟悉可以看我的这两篇文章:
- 数据本身已作脱敏处理,不可尽信。
例1:
数值策划想验证线上版本新玩家的升级和破产情况是否符合设计预期,故需查找2020.1.1-2020.2.5期间玩家首次破产时的等级的平均值,并区分应用版本$app_version、iOS和GooglePlay渠道channel。
由于存在一些小bug会导致部分玩家经验曲线有问题,所以只筛选首次破产在100级以下的玩家,以避免极端值影响平均值的计算。
数据表及字段如下:
/*events表*/
user_id event lv date channel $app_version
-----------------------------------------------------------------------------
玩家id 事件名 等级 日期 iOS或GooglePlay 应用版本
NUMBER STRING NUMBER DATE STRING STRING
-----------------------------------------------------------------------------
111 Loading 1 2020-01-01 iOS 5.3.1
222 EnterGame 2 2020-01-01 iOS 5.3.11
333 Click_1 2 2020-01-01 GooglePlay 5.2.10
333 Bankruptcy 28 2020-02-01 GooglePlay 5.3.1
... ... ... ... ... ...
/*users表*/
id channel lv user_group_3 user_group_10
------------------------------------------------------------------------------
玩家id iOS或GooglePlay 等级 用户分群1 用户分群2
NUMBER STRING NUMBER BOOL BOOL
------------------------------------------------------------------------------
111 iOS 46 0 1
222 iOS 149 0 1
333 GooglePlay 87 1 1
444 GooglePlay 34 0 0
... ... ... ... ...
注:
- users表中的user_group_10是事先已定义好分群的研究对象,取值为真时生效。user_group_3是测试机分群,取值为假时生效。
参考语句:
select channel,$app_version,avg(minlv) from
(select user_id,min(events.lv) as minlv
from users,events
where events.user_id = users.id
and event = 'Bankruptcy'
and events.channel in ('iOS','GooglePlay')
and date between '2020-01-01' and