sql >> Base de Datos >  >> RDS >> PostgreSQL

Sustraer dos consultas de la misma tabla.

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);
  • Suponiendo dayhour es del tipo de datos marca de tiempo (falta información). La conversión hasta la fecha deshabilitaría los índices básicos. Por eso lo transformé en un sargable predicado. Más detalles:
  • Por qué el cast value::int ?
  • Agregue primero, luego únase al dispositivo. Más barato.