使用 Postgres 查询选择多个数据以及特定时间之间的平均值

Query for selecting multiple data along with average values in between a specific time using Postgres

我在 table 中有来自同一数据源的两个不同日期的数据。数据样本如下

.

此 table 包含来自以 1&2 作为分支且以 aa、bb&cc 作为其子分支的服务器的 2 秒记录数据。在最初的 table 中,每秒都以类似的方式记录数据。我想在指定时间之间取每个子组的平均值,以便我可以如下所示显示我的数据。你们能帮我写一个 select 查询吗?

您可以转换 avg_aa bigint 或双精度。首先从名称字段中减去 id 和名称,然后根据 id 和日期计算平均值。

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

请从urlhttps://dbfiddle.uk/?rdbms=postgres_11&fiddle=8113ce4fd19d2865dcc5757d0e920759

检查

在平均列中使用双精度

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

请从urlhttps://dbfiddle.uk/?rdbms=postgres_11&fiddle=c70fe828008b13f7eb3feefc080f8038

检查