在sql中查找Period的计数

Sun*_*nny 10 mysql sql

我有一张桌子:

 user_id | order_date 
---------+------------
      12 | 2014-03-23
      12 | 2014-01-24
      14 | 2014-01-26
      16 | 2014-01-23
      15 | 2014-03-21
      20 | 2013-10-23
      13 | 2014-01-25
      16 | 2014-03-23
      13 | 2014-01-25
      14 | 2014-03-22
Run Code Online (Sandbox Code Playgroud)

活跃用户是指已登录过去12个月的用户.需要输出为

Period | count of Active user
----------------------------
Oct-2013 - 1 
Jan-2014 - 5 
Mar-2014 - 10
Run Code Online (Sandbox Code Playgroud)

2014年1月的价值 - 包括2014年10月的1个记录和2014年1月的4个非重复记录)

Gio*_*sos 6

您可以使用变量来计算活动用户的运行总数:

SELECT Period,
       @total:=@total+cnt AS `Count of Active Users`
FROM (       
SELECT CONCAT(MONTHNAME(order_date), '-', YEAR(order_date)) AS Period,
       COUNT(DISTINCT user_id) AS cnt       
FROM mytable 
GROUP BY Period
ORDER BY YEAR(order_date), MONTH(order_date) ) t,
(SELECT @total:=0) AS var
Run Code Online (Sandbox Code Playgroud)

子查询返回每月/每年的不同活动用户数.外部查询使用@total变量来计算活动用户计数的运行总数.

小提琴演示在这里


Yel*_*yev 1

我能做的最好的事情就是:

SELECT Date, COUNT(*) as ActiveUsers
FROM 
(
    SELECT DISTINCT userId, CONCAT(YEAR(order_date), "-", MONTH(order_date)) as Date
    FROM `a` 
    ORDER BY Date
)
AS `b`
GROUP BY Date
Run Code Online (Sandbox Code Playgroud)

输出如下:

|    Date | ActiveUsers |
|---------|-------------|
| 2013-10 |           1 |
|  2014-1 |           4 |
|  2014-3 |           4 |
Run Code Online (Sandbox Code Playgroud)

现在,对于每一行,您需要总结前几行中的活跃用户数。例如,下面是 C# 中的代码。

int total = 0;
while (reader.Read())
{ 
    total += (int)reader['ActiveUsers'];
    Console.WriteLine("{0} - {1} active users", reader['Date'].ToString(), reader['ActiveUsers'].ToString());
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,对于 2014 年 3 月,答案是 9,因为一行是重复的。