PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Odejmij dwa zapytania z tej samej tabeli

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);
  • Zakładając dayhour jest typu datastamp (brak informacji). Dotychczasowe rzutowanie wyłączyłoby podstawowe indeksy. Dlatego przekształciłem go w sargable orzec. Więcej szczegółów:
  • Dlaczego rzut value::int ?
  • Najpierw agreguj, a następnie dołącz do urządzenia. Tańsze.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zapytanie agregujące w tabeli 50M+ wierszy w PostgreSQL

  2. PostgreSQL:sześć nie tak łatwych elementów

  3. Jak Cot() działa w PostgreSQL

  4. Jak za pomocą django sprawdzić, czy coś istnieje w bazie postgresql?

  5. Postgres zagnieżdżone zapytanie SQL do pola liczenia