2017-05-23 4 views
0

Ich versuche, eine Abfrage über Postgres zu erstellen. Ich habe eine Tabelle wie folgt:Postgres komplizierte SQL-Abfrage

Date----------|Meter-----|------period-----|-----value 
2017-05-23-----meter1 ---------- 1 ------------ 2.01 
2017-05-23-----meter1 ---------- 3 ------------ 4.01 
2017-05-23-----meter1 ---------- 4 ------------ 0.00 

Die Tabelle zeigt Zählerstände. Es muss 48x Zählerablesungen pro Tag geben. Aus irgendeinem Grund kann es jedoch vorkommen, dass ein Zählerstand nicht angezeigt wird. Es wird also keine Aufzeichnung geben. Außerdem könnte ein Zählerstand 0,00 betragen.

Was ich tun muß, ist eine Reihe zu erzeugen, die mir so etwas wie dies gibt, wenn ich für die Zählerstände für ein bestimmtes Messgerät an einem bestimmten Datum zu suchen:

Period----Total 
1  --- 2.01 
2  --- null 
3  --- 4.01 
4  --- 0.00 
. 
. 
. 

Es braucht mir 48 Lesungen zu geben, auch wenn Es gibt keine Aufzeichnung. Ich versuche, ein Google-Diagramm aus einer JSON-Antwort zu füllen, und das Diagramm akzeptiert Nullwerte, aber keine "Nein" -Werte.

Ich schätze jede Hilfe.

Antwort

2

Sie können generate_series verwenden, um die Nummernliste und left join Ihre Tabelle zu generieren und fehlende Perioden als null anzuzeigen.

select g.val,t.value 
from generate_series(1,48) g(val) 
left join tbl on t.period=g.val and t.date = '2017-05-23' --change this value as required 

Wenn Sie es für alle Termine und Meter in der Tabelle benötigen, erzeugt cross join Perioden mit Terminen und Meter und left join die Tabelle auf dem.

select dm.date,dm.meter,g.val,t.value 
from generate_series(1,48) g(val) 
cross join (select distinct date,meter from t) dm 
left join t on t.period=g.val and t.date=dm.date and t.meter=dm.meter 
where dm.date = date '2017-05-23' --change this value as required 
and dm.meter='meter1' --change this value as required 
+0

Große Lösung. Ich denke, 't.meter = 'meter1'' wird auch als Teil der' left join'-Bedingung in der ersten Abfrage benötigt. –

+0

Danke Jungs, viel geholfen! :) – Daryn