0

我需要用可用的最后一个值填充缺失的日期,所以我将开始第一步以获取所有日期的查询,包括日表上缺失的日期。我知道有很多关于填写缺失日期的问题,但在这里我需要该查询的 where 子句。人们通常建议创建一个包含所有日期的单独表,然后使用左连接与其他表来获取所有日期,对于缺少的值,你得到 NULL 这很好。

所以我创建了该表并将其命名为日历,并尝试了以下查询:

SELECT d.`date`, s.`item`, s.state 
FROM calendar d LEFT JOIN daily_states s
ON d.`date` = s.`date`
WHERE s.`item` = 'item1'
ORDER BY s.`date` ASC;

希望我得到结果(example1):

Date        | Item  | State

2013-05-01    item1   state1
2013-05-02    item1   state1
2013-05-03    NULL    NULL
2013-05-04    item1   state3
2013-05-05    NULL    NULL
2013-05-06    item1   state3
2013-05-07    item1   state1

我确信 item 中只有 NULL 值实际上是 item1,但右表中缺少日期。这样我以后可以用以前的状态填充缺失的项目和状态值,并以此结果结束(示例 2):

2013-05-01    item1   state1
2013-05-02    item1   state1
2013-05-03    item1   state1
2013-05-04    item1   state3
2013-05-05    item1   state3
2013-05-06    item1   state3
2013-05-07    item1   state1

但是由于 WHERE 子句,我得到了这个(结果):

2013-05-01    item1   state1
2013-05-02    item1   state1
2013-05-04    item1   state3
2013-05-06    item1   state3
2013-05-07    item1   state1

所以我仍然没有错过日期。如何获得示例1中的结果?顺便说一句,我用示例制作了SQLfiddle。提前谢谢!

4

1 回答 1

1

还检索 NULL 值:

添加一个

OR s.item IS NULL

在你的where条款中

SELECT d.`date`, s.`item`, s.state 
FROM calendar d LEFT JOIN daily_states s
ON d.`date` = s.`date`
WHERE s.`item` = 'item1' OR s.item IS NULL
ORDER BY d.`date` ASC;

顺便说一句,我会订购d.date,而不是s.date(可能为空)

SqlFiddle

于 2013-06-12T10:21:46.817 回答