MySQL实践 - APP用户活跃+红包数据分析

通过学习数据分析案例整理 - APP用户活跃+红包领取数据分析,练习MqSQL中Join, group by, case when 语句。
数据框架如下:
活跃用户表:(是新用户列,1:新用户;0:老用户)
在这里插入图片描述

领取红包表:
在这里插入图片描述问题:

  1. 计算2019年6月1日至今,每日DAU(活跃用户是指有登陆的用户)
  2. 分析每天领取红包的用户数、人均领取金额、人均领取次数、要区分用户属性:新用户、老用户、领取红包但未登录用户
  3. 分析每个月红包领取天数,每个月领取红包用户数、人均领取金额、人均领取次数
  4. 分析每个月领过红包用户和未领红包用户的数量

解答:

  1. 问题解析:按天统计每天的登录用户数量,注意去重,以及筛选日期范围
SELECT 登录日期, COUNT(DISTINCT  用户ID) AS DAU
FROM `活跃用户表`
WHERE 登录日期 > 20190601
GROUP BY 登录日期;

结果:

在这里插入图片描述

  1. 问题解析:

每天 - 按天分组,分别计算对应字段
划分用户属性:需要关联 活跃用户表 与领取红包表,并且根据匹配的结果对用户分类

2.1) 关联两个表,并划分用户属性,并将该结果作为新的查询表格
注意:两个表都有 用户ID字段, 建议将其中一个重新命名,以免报错: duplicate fields 用户ID

SELECT a.*, b.登录日期, b.用户ID AS 用户IDlogin, b.是新用户,
   CASE b.是新用户
   WHEN 1 THEN '新用户'
   WHEN 0 THEN '老用户'
   ELSE '未登录用户'
   END as '领红包用户属性'
  FROM `领取红包表`  a 
  LEFT JOIN `活跃用户表` b ON a.抢红包日期 = b.登录日期 AND b.用户ID = a.用户ID

2.2) 每天领取红包的用户数

SELECT COUNT(DISTINCT 用户ID) FROM 新表 GROUP BY 抢红包日期

2.3) 人均领取金额

SELECT SUM(金额)/COUNT(DISTINCT 用户ID) FROM 新表 group by  抢红包日期

2.4) 人均领取次数

SELECT COUNT(*)/COUNT(DISTINCT 用户ID) FROM 新表 GROUP BY 抢红包日期

2.5) 将以上结果合并

SELECT r.抢红包日期, r.领红包用户属性, 
COUNT(DISTINCT r.用户ID) as 用户数量,
ROUND(SUM(r.金额) / COUNT(DISTINCT r.用户ID),2) as 人均领取金额,
COUNT(*)/COUNT(DISTINCT r.用户ID) as 人均领取次数
FROM 
 (SELECT a.*, b.登录日期, b.用户ID AS 用户IDlogin, b.是新用户,
   CASE b.是新用户
   WHEN 1 THEN '新用户'
   WHEN 0 THEN '老用户'
   ELSE '未登录用户'
   END as '领红包用户属性'
  FROM `领取红包表`  a 
  LEFT JOIN `活跃用户表` b ON a.抢红包日期 = b.登录日期 AND b.用户ID = a.用户ID) r
GROUP BY r.抢红包日期,r.领红包用户属性

结果如下:

在这里插入图片描述

  1. 问题解析:

每月 - 计算月份,按月分组,由于只有2019年数据,因此直接使用month函数
其他指标与第2问一致

SELECT month(抢红包日期) 月份, COUNT(抢红包日期)  as 抢红包天数,
 COUNT(DISTINCT 用户ID) as 领取红包人数,
 ROUND(SUM(金额)/COUNT(DISTINCT 用户ID),2) AS 人均领取金额,
 COUNT(*)/ COUNT(DISTINCT 用户ID) AS 人均领取次数
FROM `领取红包表`
GROUP BY month(抢红包日期)

在这里插入图片描述

  1. 问题解析:

每月 - 按月分组
领过红包:领取红包表中的每个用户都是领取用户
未领过红包:活跃用户表中有但是领取红包表中没有的用户
领过红包 VS 未领过红包:活跃用户表 LEFT JOIN 领红包表进行查看

4.1) 链接两个表, 作为最终查询的表基础

SELECT * 
FROM 活跃用户表  a
LEFT JOIN `领取红包表` b
ON a.用户ID = b.用户ID AND a.登录日期 = b.抢红包日期

4.2) 两个链接表,当领取红包表对应的用户ID为空,则说明没有领取红包,不为空则说明领取了红包,按照此条件使用CASE WHEN进行分类,后续分组查询

SELECT month(登录日期) 活跃月份, 
 CASE  WHEN b.用户ID is null THEN '没有领取红包用户' ELSE '领取红包用户' END as 是否领取红包,
 COUNT( DISTINCT a.用户ID) 用户数
FROM 活跃用户表  a
LEFT JOIN `领取红包表` b
ON a.用户ID = b.用户ID AND a.登录日期 = b.抢红包日期
GROUP BY 活跃月份, 是否领取红包;

结果为:

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值