使用者登錄檔按照時間累積統計,應用group by 以及子查詢

阿隆索逃跑了發表於2021-01-08

需求

一天運營的小姐姐跟我說,我想要一個報表,來分析從上線到現在使用者每個月的註冊數量,按照月份就行統計。並且我要知道截止到這個月總的使用者數是多少。

分析

拿到這個需求我們先看一下使用者表 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(欄位) fromBB 我們成為 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 協議》,轉載必須註明作者和本文連結
人生的意義在於承擔人生無意義的勇氣

相關文章