用户注册表按照时间累积统计,应用group by 以及子查询
需求
一天运营的小姐姐跟我说,我想要一个报表,来分析从上线到现在用户每个月的注册数量,按照月份就行统计。并且我要知道截止到这个月总的用户数是多少。
分析
拿到这个需求我们先看一下用户表 users 的结构是什么
id | name | create_at |
---|---|---|
1 | nihao | 2020-10-05 15:55:55 |
2 | wohao | 2020-10-06 15:55:55 |
那么运营的小姐姐想要得到的表是什么
当月累计 | 当月新增 | 时间年月 |
---|---|---|
1 | 1 | 2020-10 |
6 | 5 | 2020-11 |
mysql语句
首先我们先得到每个月的新增人数,这个没那么复杂
SELECT DATE_FORMAT(created_at, "%Y-%m") AS date, COUNT(*) AS num FROM users GROUP BY date
我们得到的表为
num | date |
---|---|
1 | 2020-10 |
5 | 2020-11 |
我们将上面的sql语句成为A
关键的时候来了
我们要拿到累计的数量,就需要把A语句当做一个结果表 BB
select sum(num) from {(A) as BB}
相当于
select sum(字段) from 表BB 我们成为 C语句
关键时候来了,我们要得到每个月的累计那么,就要每个月进行一次sum操作,那么就要求每次查询都要小于等于在A语句的结果的日期的那个记录进行sum
那么我们就要继续建立一个A语句的结果表我们成为AA
select ( C语句 where BB.date<= AA.date )as tnum,AA.num,AA.date from A语句 as AA
最后整理一下就是如下语句
select (
select SUM((bb.num)) from (
SELECT DATE_FORMAT(created_at, "%Y-%m") AS date, COUNT(*) AS num FROM users GROUP BY date
) as bb where aa.date >=bb.date
) as tnum,aa.num,aa.date from (SELECT DATE_FORMAT(created_at, "%Y-%m") AS date, COUNT(*) AS num FROM users GROUP BY date ) aa
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: