我有一个表,根据它是什么警报 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/