mysql - 每月队列分析 SQL

标签 mysql sql

希望对用户群进行一些同期群分析。我们有 2 个表“users”(u.) 和“sessions”(s),其中用户有“created_at”字段, session 有“start_at”字段。

基本上,我要查看的是特定月份有多少用户注册,并分析其中有多少人在接下来的几个月又回来了。

澄清我想要得到的东西,以防我的解释不清楚。

Month: January
Registered users in January: 100
How many of this 100 registered users, logged in in February?: 97
How many of this 100 registered users, logged in in Mars?: 56

Month: February 
Registered users in February: 70 
How many of this 70 registered users, logged in in Mars?: 10 
How many of this 70 registered users, logged in in April?: 32

等等……

我正在使用以下查询代码,请记住我的表日期是 UNIX 时间戳格式,这就是我使用 from_unixtime() 公式的原因。

select 
Month(from_unixtime(up.registered_at)) as Month,
count(distinct up.id) registered,
count(DISTINCT (CASE WHEN datediff(from_unixtime(u.registered_at),from_unixtime(s.start_at)) <= 60 AND datediff(from_unixtime(u.registered_at),from_unixtime(s.start_at)) > 30 THEN u.id END)) as 30to60,
count(DISTINCT (CASE WHEN datediff(from_unixtime(u.registered_at),from_unixtime(s.start_at)) <= 90 AND datediff(from_unixtime(u.registered_at),from_unixtime(s.start_at)) > 60 THEN u.id END)) as 60to90
from users  u
left join  sessions s
on u.id=s.user_id
group by 1
limit 100

查询给了我不正确的数据,它说的是注册人数的确切数量,但没有说有多少人会在接下来的几个月里回来。

你能帮帮我吗,我相信这比我想象的要容易。

提前谢谢你。

最佳答案

我会设想这样的事情:

select date_format(from_unixtime(up.registered_at), '%Y-%m') as reg_yyyymm,
       date_format(from_unixtime(s.start_at), '%Y-%m') as sess_yyyymm,
       count(distinct u.id)
from users u left join
     sessions s
     on u.id = s.user_id
group by reg_yyyymm, sess_yyyymm;

这似乎给出了您描述的结果。

关于mysql - 每月队列分析 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36691688/

相关文章:

mysql - 数据库规范化设计问题 : 2 tables sharing almost the same information

sql - 二郎和sqlite

php - SQL SELECT、AND、不等于查询中的一些问题

sql - 只比较postgres中两个时间戳的时间

sql - 有没有办法推迟更新索引?

mysql - 将所有这些命令包含在一个大的 MySQL 语句中?

sql - 如何在Sql Server中检查字符串长度然后选择子字符串

Mysql: 无法在 MySql 中创建表

mysql - 如何将当前时间显示或从服务器时间转换为本地时间

mysql - 结果差异(MySQL 5.7 与 MySQL 8.0)