SQL:在过去7天总条目,由天团,如果没有那一天的条目设置为0

我有下列的表:SQL:在过去7天总条目,由天团,如果没有那一天的条目设置为0

id | time (SQL datetime) | url 

我需要为过去7天总计从今天开始。

如果当天的总数为0 - 将其返回为0而不是完全不返回。

我已经试过这样:

SELECT 

time, COUNT(*) AS `num`

FROM

entries

WHERE

time > DATE_SUB(CURDATE(), INTERVAL 7 DAY)

GROUP BY

time

但它返回每小时汇总,从我的理解 - 我不知要日期时间戳转换为日期?

我还在学习SQL。

回答:

这是一个非常有趣的问题,因为答案比问题复杂得多。

一般来说,SQL的设计目的不是像使用普通编程语言那样使用循环和任意长度的列表,而是要动态地生成内容。它通常依赖于将表中所有的数据预先存在。

如果所有日期都在您现有的表中,没问题,只需使用GROUP BY。但是在哪里得到一个不存在于表中的日期,以显示0计数?

看着SO,过去已经有几个选项被讨论和列出。

基本上这一切归结为4种选择:

  • 使用临时或永久表与日期的预建的必要范围。与所有SQL服务器兼容,但有点不好意思,另外需要记住更新范围表;
  • 在SQL以外的编程语言中创建所需日期的列表,然后比较返回的值。根本不算优雅;
  • 使用服务器端过程:便携性较差,但比较容易 - 创建一个过程,该过程返回一个行列表,其中包含您指定为过程参数的间隔中的日期行;
  • 使用额外的SQL服务器端的调整,如变量。

在你的情况,从这个问题的答案图纸:Get a list of dates between two dates,我自己会考虑使用MySQL的变量,但是,因为你需要包括日期,这不你的数据表中,这将可能不工作(至少我没找到一个工作解决方案)。

所以,使用任何在上市问题的解决方案,您应该创建一些表像您的实际过去7天的日期列表,像这样:

temporary table LASTDAYS 

datetime D

-------------

2017-12-27

2017-12-26

2017-12-25

2017-12-24

2017-12-23

2017-12-22

2017-12-21

(顺序不重要这里)

然后你做:

SELECT DATE(LASTDAYS.D) AS D1, COUNT(YOURTABLE.id) AS num 

FROM LASTDAYS LEFT OUTER JOIN YOURTABLE

ON DATE(YOURTABLE.time)=date(LASTDAYS.D)

GROUP BY D1;

(注OUTER join)

创建这样一个表会是这样的最简单的方法:

CREATE TEMPORARY TABLE LASTDAYS (D datetime); 

INSERT INTO LASTDAYS VALUES (CURRENT_TIMESTAMP);

INSERT INTO LASTDAYS VALUES (DATE_SUB(CURRENT_TIMESTAMP,INTERVAL 1 DAY));

INSERT INTO LASTDAYS VALUES (DATE_SUB(CURRENT_TIMESTAMP,INTERVAL 2 DAY));

INSERT INTO LASTDAYS VALUES (DATE_SUB(CURRENT_TIMESTAMP,INTERVAL 3 DAY));

INSERT INTO LASTDAYS VALUES (DATE_SUB(CURRENT_TIMESTAMP,INTERVAL 4 DAY));

INSERT INTO LASTDAYS VALUES (DATE_SUB(CURRENT_TIMESTAMP,INTERVAL 5 DAY));

INSERT INTO LASTDAYS VALUES (DATE_SUB(CURRENT_TIMESTAMP,INTERVAL 6 DAY));

然而,这确实是暴力破解。虽然,因为你只需要这7行,它甚至可以包含在你的SELECT中。我不确定,但如果它被包含在BEGIN/END事务块中,那么临时表甚至不会在SELECT之间持续存在。

以上是 SQL:在过去7天总条目,由天团,如果没有那一天的条目设置为0 的全部内容, 来源链接: utcz.com/qa/266301.html

回到顶部