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