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

Dotaz na výběr více dat spolu s průměrnými hodnotami v určitém čase pomocí Postgres

Avg_aa můžete převést na bigint nebo double precision. Nejprve odečtěte id a jméno od pole jména a poté vypočítejte průměr podle id a data.

-- 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;

Zkontrolujte prosím z adresy URL https://dbfiddle.uk/?rdb6ddle.uk/?rdbms&ddle915055555504957171505555

Použijte dvojitou přesnost ve sloupci prům

-- 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;

Zkontrolujte prosím z adresy URL https://dbfiddle.uk/?rdbms=postgres_130817080838cfedgres_1800817083838cfedgres_1




  1. Nemohu přijít na to, jak aktualizovat čas posledního přihlášení

  2. Spojte více tabulek se stejným názvem sloupce

  3. porovnání dvou kurzorů v oracle místo použití MINUS

  4. Nejlepší způsob, jak načíst poslední 4 řádky ze sady výsledků pomocí mysql