sql - 选择日期的特定值的平均值

标签 sql database postgresql average

我有这张表“meteorecords”,其中包含日期、温度、rh 和制作记录的气象站。

    rerowid    date       temp    rh     meteostid
    1       2019-09-9     28.8    55.6    AITNIA2
    2       2019-09-10    30.3    51.3    AITNIA2
    3       2019-09-11    28.6    49.0    AITNIA2
    4       2019-09-12    26.7    51.9    AITNIA2
    5       2019-09-13    25.3    48.1    AITNIA2
    6       2019-09-14    25.3    38.5    AITNIA2
    7       2019-09-15    25.0    42.2    AITNIA2
    8       2019-09-16    24.1    52.1    AITNIA2
    9       2019-09-17    23.3    65.2    AITNIA2
    10      2019-09-18    22.7    72.2    AITNIA2
    11      2019-09-19    23.4    73.9    AITNIA2
    12      2019-09-20    23.1    76.7    AITNIA2
    13      2019-09-21    22.5    60.3    AITNIA2
    14      2019-09-22    20.9    61.6    AITNIA2
    15      2019-09-23    21.9    73.9    AITNIA2
    16      2019-09-24    23.2    79.6    AITNIA2
    17      2019-09-25    21.8    73.6    AITNIA2
    18      2019-09-26    22.2    77.6    AITNIA2
    19      2019-09-27    22.9    77.1    AITNIA2
    20      2019-09-28    22.8    68.4    AITNIA2
    21      2019-09-29    22.6    75.5    AITNIA2
               ...........................

我要选择所有字段加上最近3天的平均温度。

我正在使用 postgresql,因为数据库中有一些几何和空间数据。 我没有运气就试过了:

    SELECT rerowid,redate,retemp,rerh,meteostid,
      (SELECT AVG(retemp) 
       FROM meteorecords m 
       WHERE meteostid = m.meteostid AND m.redate BETWEEN redate-2 AND redate)
     FROM meteorecords

返回这样的结果:

    rerowid   date         temp    rh      meteostid   AVG_Last_3_Days
      1       2019-09-09   28.8    55.6    AITNIA2     22.2824
      2       2019-09-10   30.3    51.3    AITNIA2     22.2824 
      3       2019-09-11   28.6    49.0    AITNIA2     22.2824
      4       2019-09-12   26.7    51.9    AITNIA2     22.2824
      5       2019-09-13   25.3    48.1    AITNIA2     22.2824
      6       2019-09-14   25.3    38.5    AITNIA2     22.2824
      7       2019-09-15   25.1    42.2    AITNIA2     22.2824
                      .................. 

但我想要这样的结果:

    rerowid   date         temp    rh      meteostid   AVG_Last_3_Days
      1       2019-09-09   28.8    55.6    AITNIA2     28.8
      2       2019-09-10   30.3    51.3    AITNIA2     29.5 
      3       2019-09-11   28.6    49.0    AITNIA2     29.2
      4       2019-09-12   26.7    51.9    AITNIA2     28.5
      5       2019-09-13   25.3    48.1    AITNIA2     26.9
      6       2019-09-14   25.3    38.5    AITNIA2     25.8
      7       2019-09-15   25.1    42.2    AITNIA2     25.2
                      .................. 

最佳答案

使用窗口函数。如果您每个日期只有一行,或者您想要前三个日期*在数据中):

SELECT rerowid, redate, retemp, rerh, meteostid,
       AVG(retemp) OVER (PARTITION BY meteostid ORDER BY redate ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) as avg_retemp_3
FROM meteorecords;

如果您想要 3 个时间顺序,请使用RANGE:

SELECT rerowid, redate, retemp, rerh, meteostid,
       AVG(retemp) OVER (PARTITION BY meteostid
                         ORDER BY redate 
                         RANGE BETWEEN '2 DAY' PRECEDING AND CURRENT ROW) as avg_retemp_3
FROM meteorecords;

关于sql - 选择日期的特定值的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58645309/

相关文章:

sql - 如何着手优化 Oracle 查询?

sql - 如何根据列过滤器缩小不同行的范围?

php - 当 2 列必须匹配唯一行时在 MySQL 数据库中使用 REPLACE INTO

database - INSERT ...RETURNING .. 当 BEFORE 触发器取消语句时变为空

macos - Homebrew 的 postgres 坏了

postgresql - Play Framework PostgreSQL db.default.username 默认为 linux 用户名

mysql - SQL 的快速查询

mysql - 如何将包含双引号的字符串添加到sql数据库?

sql - 修复 SQL 中的重复客户

mysql - 选择另一个 RDBMS