sql >> Databáze >  >> RDS >> PostgreSQL

Odeberte dva dotazy ze stejné tabulky

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);
  • Za předpokladu dayhour je datového typu časové razítko (informace chybí). Dosavadní obsazení by zakázalo základní indexy. Proto jsem jej přeměnil na sargable predikát. Další podrobnosti:
  • Proč cast value::int ?
  • Nejprve agregujte a poté se připojte k zařízení. Levnější.



  1. ORACLE a TRIGGERS (vloženo, aktualizováno, odstraněno)

  2. BDE vs ADO v Delphi

  3. Klíčové slovo LIMIT na MySQL s připraveným příkazem

  4. Co může způsobit nečinnost v transakci u příkazů BEGIN