2013-06-12 1 views
0

J'ai besoin de remplir les dates manquantes avec les dernières valeurs disponibles, donc je vais à la première étape pour obtenir une requête avec toutes les dates, y compris un jour absent. Je sais qu'il y a beaucoup de questions sur les dates manquantes, mais ici, j'ai besoin d'une clause sur cette question. Les gens suggèrent généralement de faire une table séparée avec toutes les dates, puis d'utiliser la jointure gauche avec l'autre table pour obtenir toutes les dates, et pour les valeurs manquantes, vous obtenez NULL ce qui est bien.où clause dans la requête qui contient toutes les dates dans la plage

donc j'ai créé cette table et l'a appelé le calendrier, et essayé cette requête:

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; 

Espérant j'obtenir le résultat (exemple1):

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 

où je suis des valeurs sûres NULL uniquement dans l'article est en fait item1 mais la date est absente de la table de droite. De cette façon, je peux remplir plus tard les articles manquants et les valeurs étatiques avec les Etats précédents et se terminent par ce résultat (exemple2):

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 

Mais à cause de la clause WHERE, je reçois ce (résultat):

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 

donc je n'ai toujours pas de dates manquantes. Comment obtenir le résultat comme dans l'exemple 1? Btw j'ai fait SQLfiddle avec des exemples. Merci d'avance!

Répondre

1

récupérer aussi les valeurs NULL:

ajouter un

OR s.item IS NULL 

dans votre where clause

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; 

par la façon dont je commanderais par d.date, non s.date (qui peut être nulle

SqlFiddle

+0

thx Raphael! C'est le résultat que je voulais. –

+0

@BojanKovacevic vous êtes les bienvenus. –

Questions connexes