sql >> Database >  >> RDS >> PostgreSQL

Trek twee zoekopdrachten uit dezelfde tabel

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);
  • Uitgaande van dayhour is van het gegevenstype tijdstempel (informatie ontbreekt). De cast tot nu toe zou basisindexen uitschakelen. Daarom heb ik het getransformeerd naar een sargable predikaat. Meer details:
  • Waarom de cast value::int ?
  • Eerst aggregeren en vervolgens toevoegen aan apparaat. Goedkoper.



  1. Minimaliseren van SQL-query's met behulp van join met een-op-veel-relatie

  2. Top n procent top n%

  3. Kan geen verbinding maken met lokale MySQL-server via socket '/var/lib/mysql/mysql.sock' (2)

  4. trigger als anders