Mysql 每日新用户统计

Posted 赵晓东-Nastu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql 每日新用户统计相关的知识,希望对你有一定的参考价值。

描述

Traffic 表:

±--------------±--------+
| Column Name | Type |
±--------------±--------+
| user_id | int |
| activity | enum |
| activity_date | date |
±--------------±--------+
该表没有主键,它可能有重复的行。
activity 列是 ENUM 类型,可能取 (‘login’, ‘logout’, ‘jobs’, ‘groups’, ‘homepage’) 几个值之一。

编写一个 SQL 查询,以查询从今天起最多 90 天内,每个日期该日期首次登录的用户数。假设今天是 2019-06-30.

查询结果格式如下例所示:

Traffic 表:
±--------±---------±--------------+
| user_id | activity | activity_date |
±--------±---------±--------------+
| 1 | login | 2019-05-01 |
| 1 | homepage | 2019-05-01 |
| 1 | logout | 2019-05-01 |
| 2 | login | 2019-06-21 |
| 2 | logout | 2019-06-21 |
| 3 | login | 2019-01-01 |
| 3 | jobs | 2019-01-01 |
| 3 | logout | 2019-01-01 |
| 4 | login | 2019-06-21 |
| 4 | groups | 2019-06-21 |
| 4 | logout | 2019-06-21 |
| 5 | login | 2019-03-01 |
| 5 | logout | 2019-03-01 |
| 5 | login | 2019-06-21 |
| 5 | logout | 2019-06-21 |
±--------±---------±--------------+
Result 表:
±-----------±------------+
| login_date | user_count |
±-----------±------------+
| 2019-05-01 | 1 |
| 2019-06-21 | 2 |
±-----------±------------+
请注意,我们只关心用户数非零的日期.
ID 为 5 的用户第一次登陆于 2019-03-01,因此他不算在 2019-06-21 的的统计内。

思路

刚开始我的思路是它让求每个日期该日期首次登录的用户数,那我就先求每个日期登录的用户数,再将首次作为条件进行查询。 但是发现这样还是比较麻烦,如果麻烦了,我们就换另一种思路。

以人为角度,求出每个人在登录时候的最小的日期,然后再将日期进行合并,即可。

select 
activity_date login_date ,
count(*) user_count  
from 
(
select
user_id,
min(activity_date) activity_date
from 
Traffic 
where 
activity = 'login'
group by 
user_id
) t
where 
datediff('2019-06-30',activity_date )<=90
group by 
t.activity_date

以上是关于Mysql 每日新用户统计的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode(数据库)- 每日新用户统计

每日SQL打卡​​​​​​​​​​​​​​​DAY 13丨每日新用户统计难度中等

适用于 Android 的 Fabric 插件中的每日新用户身份 - crashlytics

用户行为指标浅析

如何强制Margin-left(marginStart)在片段中成像?

sql 统计MySQL的每分钟增删改查次数