选择平均日期的平均值

时间:2019-10-31 14:18:58

标签: 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
                      .................. 

1 个答案:

答案 0 :(得分:1)

使用窗口功能。如果每个日期有一行,或者想要*数据中的前三个日期):

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;