Postgresql postgres:当前行值为空时使用上一行值

Postgresql postgres:当前行值为空时使用上一行值,postgresql,Postgresql,在我的应用程序中,我需要生成一个数据输出,然后转换为postgres数据库中的JSON数据,该数据库实际上是传感器收集的温度数据 对于上午11点到中午之间的数据,数据存储在设备历史日志中,如下所示: row_id;deviceid;sensor_value_raw;last_update 104401;20865735;21.56;"2015-06-10 11:00:14" 104432;493417852;23.9;"2015-06-10 11:00:58" 104516;20865735;2

在我的应用程序中,我需要生成一个数据输出,然后转换为postgres数据库中的JSON数据,该数据库实际上是传感器收集的温度数据

对于上午11点到中午之间的数据,数据存储在设备历史日志中,如下所示:

row_id;deviceid;sensor_value_raw;last_update
104401;20865735;21.56;"2015-06-10 11:00:14"
104432;493417852;23.9;"2015-06-10 11:00:58"
104516;20865735;21.06;"2015-06-10 11:05:14"
104578;493417852;23.7;"2015-06-10 11:06:43"
104583;20865735;21.12;"2015-06-10 11:13:21"
104601;20865735;21.18;"2015-06-10 11:17:25"
104623;493417852;22.2;"2015-06-10 11:18:21"
104642;20865735;21.25;"2015-06-10 11:21:29"
104937;20865735;21.31;"2015-06-10 11:25:33"
105081;20865735;21.37;"2015-06-10 11:33:41"
105154;20865735;21.43;"2015-06-10 11:37:45"
105303;493417852;24;"2015-06-10 11:46:09"
105358;20865735;21.62;"2015-06-10 11:49:58"
我想得到数据的5分钟平均值,目前我正在使用以下查询:

SELECT grid.t5||'.000000' as ts, 
            CASE
                WHEN avg(t.sensor_value_raw) ISNULL THEN -1
                ELSE avg(t.sensor_value_raw) 
            END AS sensorvalue
FROM (

      SELECT date_trunc('min', time_series) as t5 
      FROM generate_series('2015-06-10 11:00:00'::timestamp, '2015-06-11 12:00:00', 
                   '5 min') as time_series

   ) grid
LEFT JOIN device_history_log t 
     ON t.last_update >= grid.t5 AND t.last_update <  grid.t5 +  interval '5 min' AND (t.deviceid = 493417852 or t.deviceid = 20865735)
GROUP  BY grid.t5
ORDER  BY grid.t5
我需要平均值,因为有多个传感器报告,因此需要有一个平均值

我的问题是,10:40:00而不是-1的值是否可能具有以前的值,因为温度传感器仅报告温度的“变化”,因此“无数据”表示“无变化”

另外,对于第一个值-1,因此没有以前的数据,如果可能的话,我希望删除/忽略它们,这可以在解析数据时执行,但如果可以执行,则查询级别会更好

因此,我的理想结果集如下:

"2015-06-10 11:00:00.000000";23.8999996185303
"2015-06-10 11:05:00.000000";21.0599994659424
"2015-06-10 11:10:00.000000";21.1200008392334
"2015-06-10 11:15:00.000000";21.1800003051758
"2015-06-10 11:20:00.000000";21.25
"2015-06-10 11:25:00.000000";21.3099994659424
"2015-06-10 11:30:00.000000";21.3700008392334
"2015-06-10 11:35:00.000000";21.4300003051758
"2015-06-10 11:40:00.000000";-1
"2015-06-10 11:45:00.000000";22.8100004196167
"2015-06-10 11:50:00.000000";-1
"2015-06-10 11:55:00.000000";-1
"2015-06-10 12:00:00.000000";22.9250001907349
"2015-06-10 11:00:00.000000";23.8999996185303
"2015-06-10 11:05:00.000000";21.0599994659424
"2015-06-10 11:10:00.000000";21.1200008392334
"2015-06-10 11:15:00.000000";21.1800003051758
"2015-06-10 11:20:00.000000";21.25
"2015-06-10 11:25:00.000000";21.3099994659424
"2015-06-10 11:30:00.000000";21.3700008392334
"2015-06-10 11:35:00.000000";21.4300003051758
"2015-06-10 11:40:00.000000";21.4300003051758
"2015-06-10 11:45:00.000000";22.8100004196167
"2015-06-10 11:50:00.000000";22.8100004196167
"2015-06-10 11:55:00.000000";22.8100004196167
"2015-06-10 12:00:00.000000";22.9250001907349
谢谢大家!

下面的查询将填充原始查询结果集中的空值。该方法包括根据空值的数量将数据分割成多个分区,并从每个分区中选择第一个非空值,然后将*添加到select以查看其工作方式

WITH survey AS (

    SELECT grid.t5||'.000000' as ts, 
        CASE
            WHEN avg(t.sensor_value_raw) ISNULL THEN -1
            ELSE avg(t.sensor_value_raw) 
        END AS sensorvalue
    FROM (

          SELECT date_trunc('min', time_series) as t5 
          FROM generate_series('2015-06-10 11:00:00'::timestamp, '2015-06-11 12:00:00', 
                       '5 min') as time_series

       ) grid
    LEFT JOIN device_history_log t 
         ON t.last_update >= grid.t5 AND t.last_update <  grid.t5 +  interval '5 min' AND (t.deviceid = 493417852 or t.deviceid = 20865735)
    GROUP  BY grid.t5
    ORDER  BY grid.t5)

SELECT
    ts, first_value(sensorvalue) OVER (PARTITION BY part ORDER BY ts) sensorvalue
FROM (  
    SELECT *, sum((sensorvalue != -1)::int) OVER (ORDER BY ts) part
    FROM survey) alias

如果您提供一个测试用例,其中包含用于样本数据的CREATETABLE和INSERT语句,以及一个手工制作的预期结果表(可能是@Nicolai的副本),那就太好了-谢谢!添加了信息。@Kristján-我读了那篇文章,但我的数据是用平均值聚合的,这至少让我有点复杂…谢谢@klin,但我需要平均值,因为有多个deviceid温度传感器返回报告。我已经更新了数据,使其更加明确。@Kostas:请参阅更改后的答案。谢谢@klin!这太棒了!作品