mysql - 给定日期范围内的每日活跃用户数

标签 mysql

我需要根据开始日期和结束日期查找活跃用户的每日总数。

注册表

id  registration_no  start_date  end_date
1   1000             2014/12/01  2014/12/03
2   1001             2014/12/01  2014/12/03
3   1002             2014/12/02  2014/12/04
4   1003             2014/12/02  2014/12/04
5   1004             2014/12/02  2014/12/04
6   1005             2014/12/03  2014/12/05
7   1006             2014/12/05  2014/12/06
8   1007             2014/12/05  2014/12/09
9   1008             2014/12/06  2014/12/10
10  1009             2014/12/07  2014/12/11

结果应采用以下格式。

Date        Active Users
2014-12-01  2
2014-12-02  5
2014-12-03  6
2014-12-04  4
2014-12-05  3
2014-12-06  3
2014-12-07  3
2014-12-08  3
2014-12-09  3
2014-12-10  2
2014-12-11  1
2014-12-12  0

我知道以下查询不起作用。

SELECT start_date, count(*) FROM registration
WHERE start_date >= '2014/12/01' AND end_date <='2014/12/12'
GROUP BY start_date

这不是想要的输出:

2014-12-01 2 
2014-12-02 3 
2014-12-03 1 
2014-12-05 2 
2014-12-06 1 
2014-12-07 1

如有任何帮助,我们将不胜感激。

最佳答案

您需要创建一个包含所有所需日期的“日历”,然后使用如下查询:

SELECT calDay as `Date`, count(id) as `Active Users`
FROM   (SELECT cast('2014-12-01' + interval `day` day as date) calDay
        FROM   days31
        WHERE  cast('2014-12-01' + interval `day` day as date) < '2014-12-12') calendar
LEFT JOIN registration on (calDay between start_date and end_date)
GROUP BY calDay
ORDER BY calDay;

你可以看到它在这个 fiddle 中工作,其中 days31 只是一个包含 0-30 整数的 View 。这允许查询在最多 31 天的任何日历中工作。您可以向 View 添加更多天数或使用交叉连接动态生成它们。参见 http://www.artfulsoftware.com/infotree/qrytip.php?id=95

关于mysql - 给定日期范围内的每日活跃用户数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27761170/

相关文章:

mysql触发器。如果插入行中的值为空(默认),如何正确更改值

Mysql 与 Postgres 读取操作

mysql - 在 node.js 中检索包含 AreaName 的条目时出错

mysql - 将查询存储在bash中的数组中

mysql - 分割逗号分隔的字符串 --> FUNCTION db.CHARINDEX 不存在

PHP 和 SQL 无法正常工作

php - 正则表达式帮助...php检查条目格式

mysql - 在两个表之间添加条件行进行查询

MySQL 从多个表中选择 2 个项目

php - 更新选项在 PHP 的购物车中不起作用