2016-09-12 2 views
1

У меня есть мнение в PostgreSQL, как это .:таблицы Отбросить/подзапросы с нулями или пустым

SELECT met1.tiempo, 
    met1.pyrseg AS met1_pyrseg, 
    met1.pyrhor AS met1_pyrhor, 
    met2.pyrseg AS met2_pyrseg, 
    met2.pyrhor AS met2_pyrhor, 
    met3.pyrseg AS met3_pyrseg, 
    met3.pyrhor AS met3_pyrhor 
FROM  
    (SELECT meteo_hour.tstamp AS tiempo, 
     avg(meteo_hour.avg_globalradiation1) AS pyrseg, 
     avg(meteo_hour.avg_globalradiation2) AS pyrhor 
    FROM dw.meteo_hour 
    WHERE meteo_hour.meteo = 0 
    GROUP BY meteo_hour.tstamp) met1, 

    (SELECT meteo_hour.tstamp AS tiempo, 
     avg(meteo_hour.avg_globalradiation1) AS pyrseg, 
     avg(meteo_hour.avg_globalradiation2) AS pyrhor 
    FROM dw.meteo_hour 
    WHERE meteo_hour.meteo = 25 
    GROUP BY meteo_hour.tstamp) met2, 

    (SELECT meteo_hour.tstamp AS tiempo, 
     avg(meteo_hour.avg_globalradiation1) AS pyrseg, 
     avg(meteo_hour.avg_globalradiation2) AS pyrhor 
    FROM dw.meteo_hour 
    WHERE meteo_hour.meteo = 35 
    GROUP BY meteo_hour.tstamp) met3 

WHERE met1.tiempo = met2.tiempo AND met3.tiempo = met1.tiempo 

Проблема возникает, когда один из 3-х подзапросов не удается. Поскольку есть один подзапрос без значений, то последний WHERE не выполняется, потому что одно из сравнений относится к нулевым значениям.

Как я могу отбросить подзапрос, когда есть нулевые значения или пусто?

ответ

1

Вы должны использовать FULL JOIN. С некоторыми другими улучшениями вы получите следующее:

SELECT tiempo, met1_pyrseg, met1_pyrhor, 
       met2_pyrseg, met2_pyrhor, 
       met3_pyrseg, met3_pyrhor 
FROM (
    SELECT tstamp AS tiempo, 
      avg(avg_globalradiation1) AS met1_pyrseg, 
      avg(avg_globalradiation2) AS met1_pyrhor 
    FROM dw.meteo_hour 
    WHERE meteo = 0 
    GROUP BY tstamp) met1 
FULL JOIN (
    SELECT tstamp AS tiempo, 
      avg(avg_globalradiation1) AS met2_pyrseg, 
      avg(avg_globalradiation2) AS met2_pyrhor 
    FROM dw.meteo_hour 
    WHERE meteo = 25 
    GROUP BY tstamp) met2 USING (tiempo) 
FULL JOIN (
    SELECT tstamp AS tiempo, 
      avg(avg_globalradiation1) AS met3_pyrseg, 
      avg(avg_globalradiation2) AS met3_pyrhor 
    FROM dw.meteo_hour 
    WHERE meteo = 35 
    GROUP BY tstamp) met3 USING (tiempo) 
ORDER BY tiempo; 
+0

Ooooohhhh очень, очень, очень спасибо. Иногда вы получаете идею в голову, и решение так просто. Решенный –

Смежные вопросы