mysql - 获取日期,即使它不存在于 SQL SELECT 语句的表中

标签 mysql sql date select exists

我有一个表,根据它是什么警报 ID 存储错误数量。该表看起来像这样:

|----DATE----|---ALARM_ID---|---COUNTER---|
| 2012-01-01 |      1       |      32     |
| 2012-01-01 |      2       |      28     |
| 2012-01-02 |      1       |      12     |
| 2012-01-02 |      2       |      23     |
| 2012-01-03 |      1       |      3      |
| 2012-01-03 |      2       |      9      |
| 2012-01-05 |      1       |      8      |
| 2012-01-05 |      2       |      1      |
| 2012-01-07 |      1       |      102    |
| 2012-01-07 |      2       |      78     |

请注意日期 (2012-01-03 - 2012-01-05) 和 (2012-01-05 - 2012-01-07) 之间的差距。在这些日期没有任何数据,因为我的程序正在监视的系统在那个日期没有报告任何错误。我正在寻找的是一个 SQL SELECT 查询,它返回每个日期的错误总数,例如:

|----DATE----|---COUNTER---|
| 2012-01-01 |      60     |
| 2012-01-02 |      35     |
| 2012-01-03 |      12     |
| 2012-01-04 |      0      |
| 2012-01-05 |      9      |
| 2012-01-06 |      0      |
| 2012-01-07 |      180    |

我有一个返回 ID 的查询,即使它们不存在于表中,如果 ID 不存在,则无论如何返回 ID,COUNTER 值为 0。因此:

        BEFORE                                     AFTER

|---ID---|---COUNTER---|                  |---ID---|---COUNTER---|
|   1    |      2      |                  |   1    |      2      |
|   2    |      6      |                  |   2    |      6      |
|   3    |      1      |       -->        |   3    |      1      |
|   5    |      9      |                  |   4    |      0      |
|   6    |      10     |                  |   5    |      9      |
                                          |   6    |      10     |
                                          |   7    |      0      |
                                          |   8    |      0      |

查询是这样的:

select t.num as ID, coalesce(yt.COUNTER, 0)
from all_stats yt right join 
( select t1.num + t2.num * 10 + t3.num * 100 + t4.num * 1000 as num 
from ( select 1 as num union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9 union select 0 ) t1 cross join 
( select 1 as num union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9 union select 0 ) t2 cross join 
( select 1 as num union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9 union select 0 ) t3 cross join 
( select 1 as num union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9 union select 0 ) t4 ) 
t on yt.ID = t.num 
where (t.num between (select min(ID) from all_stats) and (select max(ID) from all_stats)) order by ID

我不知道如何更改有关日期的查询。有人可以帮我解决这个问题吗?

我正在使用 MySQL

提前致谢,史蒂夫-O

最佳答案

确切的细节将取决于 DBMS 和数据库的性质(例如,面向 OLAP 与面向 OLTP),但一种常见的通用方法是创建一个辅助日历将日期表示为 dimension 的表.然后您可以使用常规的 JOIN,而不必使用复杂的逻辑来生成缺失的日期。

this StackOverflow question 的答案描述如何在 MySQL 上应用这种方法。

顺便说一句,您可以通过numbers 表对数字使用类似的方法;我自己从来没有为数字做过,但这似乎是一个流行的想法;见this dba.stackexchange.com question .

关于mysql - 获取日期,即使它不存在于 SQL SELECT 语句的表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9228262/

相关文章:

date - 在 Go 中解析时间字符串

php - 通过php动态设置mysql中的join类型

sql - 将 XML 导入 SQL Server

r - 当数据框包含日期格式时,为什么按列应用求和并且 colSums 不同?

python - Django:组外键计数

使用 desc 后 SQL Server 倒序

javascript - 如何在 Javascript 中格式化日期

MySql 查询 - 多个 SELECT 语句

mysql - 内连接内的 SQL 查询

java - Docker 容器与 2 个应用程序交互