SELECT b.name, a.*, a.sum2 - a.sum3 AS diff
FROM (
SELECT id
, sum(CASE WHEN value_type = 2 THEN value::int END) AS sum2
, sum(CASE WHEN value_type = 3 THEN value::int END) AS sum3
FROM data
WHERE id = 1
AND value_type IN (2, 3)
AND dayhour >= '2015-12-12 0:0'::timestamp
AND dayhour < '2015-12-13 0:0'::timestamp
GROUP BY 1
) a
JOIN device b USING (id);
- Angenommen
dayhour
ist vom Datentyp timestamp (Informationen fehlen). Die bisherige Umwandlung würde Basisindizes deaktivieren. Deshalb habe ich es in ein Sargable
umgewandelt Prädikat. Weitere Einzelheiten:
- Warum die Umwandlung
value::int
?
- Zuerst aggregieren, dann mit dem Gerät verbinden. Günstiger.