数据库
首页 > 数据库> > mysql-获取每天未发生的事件的每日计数

mysql-获取每天未发生的事件的每日计数

作者:互联网

我有一个客户表,在进行客户注册时会在其中插入新行.

问题

我想知道在给定日期范围内每天的注册总数.

例如,查找从2015-07-01到2015-07-10每天的注册总数

客户表
样本数据[显示相关列]

customerid    username    created
1             mrbean      2015-06-01
2             tom         2015-07-01
3             jerry       2015-07-01
4             bond        2015-07-02
5             superman    2015-07-10
6             tintin      2015-08-01
7             batman      2015-08-01
8             joker       2015-08-01

所需输出

created      signup
2015-07-01   2
2015-07-02   1
2015-07-03   0
2015-07-04   0
2015-07-05   0
2015-07-06   0
2015-07-07   0
2015-07-08   0
2015-07-09   0
2015-07-10   1

查询使用

SELECT 
    DATE(created) AS created, COUNT(1) AS signup
FROM
    customer
WHERE
    DATE(created) BETWEEN '2015-07-01' AND '2015-07-10'
GROUP BY DATE(created)
ORDER BY DATE(created)

我得到以下输出:

created      signup
2015-07-01   2
2015-07-02   1
2015-07-10   1

我应该在查询中进行哪些修改以获取所需的输出?

解决方法:

您正在寻找一种列出所有日期的方法,甚至包括那些未在客户表中显示的日期.在SQL中这是一个臭名昭著的痛苦.这是因为SQL的纯格式缺少任何东西(基数,天数或其他任何东西)的连续序列的概念.

因此,您需要引入一个包含连续基数或日期等内容的表,然后将现有数据左联接到该表中.

有几种方法可以做到这一点.一种方法是创建一个自己的日历表,该表在当前的十年或世纪之内每天都行,然后加入该行. (与现代数据库的功能相比,该表不会很大.

假设您有该表,并且该表具有名为date的列.然后,您将执行此操作.

 SELECT calendar.date AS created,
        ISNULL(a.customer_count, 0) AS customer_count
   FROM calendar
   LEFT JOIN ( 
            SELECT COUNT(*) AS customer_count,
                   DATE(created) AS created
              FROM customer
             GROUP BY DATE(created)
        ) a ON calendar.date = a.created
   WHERE calendar.date BETWEEN start AND finish 
   ORDER BY calendar.date

注意几件事.首先,从日历表向数据集的LEFT JOIN.如果使用普通的JOIN,则数据集中的缺失数据将禁止日历中的行.

其次,顶层SELECT中的ISNULL将数据集中缺失的null值转换为零值.

现在,您问,我在哪里可以得到该日历表?我谨建议您查一下,如果无法解决,请问另一个问题.

我为此写了一篇文章,您可以在这里找到.http://www.plumislandmedia.net/mysql/filling-missing-data-sequences-cardinal-integers/

标签:aggregate-functions,datetime,mysql
来源: https://codeday.me/bug/20191118/2031847.html