我有一张桌子:
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个非重复记录)
您可以使用变量来计算活动用户的运行总数:
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
变量来计算活动用户计数的运行总数.
我能做的最好的事情就是:
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,因为一行是重复的。
归档时间: |
|
查看次数: |
835 次 |
最近记录: |