PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Abfrage zum Auswählen mehrerer Daten zusammen mit Durchschnittswerten zwischen einer bestimmten Zeit mit Postgres

Sie können avg_aa entweder bigint oder mit doppelter Genauigkeit konvertieren. Subtrahieren Sie zuerst die ID und den Namen vom Namensfeld und berechnen Sie dann den Durchschnitt anhand der ID und des Datums.

-- PostgreSQL(v11)
    WITH cte_t AS (
     SELECT LEFT(name, 1) id
          , RIGHT(name, POSITION('.' IN REVERSE(name)) - 1) t_name
          , value
          , time_stamp
     FROM test
)
SELECT id
          , time_stamp :: DATE "date"
          , AVG(CASE WHEN t_name = 'aa' THEN value END) :: BIGINT "avg(aa)"
          , AVG(CASE WHEN t_name = 'bb' THEN value END) :: BIGINT "avg(bb)"
          , AVG(CASE WHEN t_name = 'cc' THEN value END) :: BIGINT "avg(cc)"
     FROM cte_t
     GROUP BY id, time_stamp :: DATE
     ORDER BY "date", id;

Bitte überprüfen Sie die URL https://dbfiddle.uk/?rdbms=postgres_11&fiddle=8113ce4fd19d2865dcc5757d0e9

Verwenden Sie doppelte Genauigkeit in der avg-Spalte

-- PostgreSQL(v11)
WITH cte_t AS (
     SELECT LEFT(name, 1) id
          , RIGHT(name, POSITION('.' IN REVERSE(name)) - 1) t_name
          , value
          , time_stamp
     FROM test
)
SELECT id
          , time_stamp :: DATE "date"
          , AVG(CASE WHEN t_name = 'aa' THEN value END) :: DOUBLE PRECISION "avg(aa)"
          , AVG(CASE WHEN t_name = 'bb' THEN value END) :: DOUBLE PRECISION "avg(bb)"
          , AVG(CASE WHEN t_name = 'cc' THEN value END) :: DOUBLE PRECISION "avg(cc)"
     FROM cte_t
     GROUP BY id, time_stamp :: DATE
     ORDER BY "date", id;

Bitte überprüfen Sie die URL https://dbfiddle.uk/?rdbms=postgres_11&fiddle=c70fe828008b13f7eb3feefc380f80