有没有办法在 SQL VIEW 中用 NULL 填充缺失的数据点?

Is there a way to fill in missing data points with NULL in SQL VIEWs?

我有一个名为 measurement_stat 的 table,它采用以下形式:

id     sensor_name              timestamp           value_cal 
1   measurement_status    2020-07-28 16:00:00    start_measurement
2   measurement_status    2020-07-28 17:00:00    stop_measurement
3   measurement_status    2020-07-28 18:00:00    start_measurement
4   measurement_status    2020-07-28 19:00:00    stop_measurement
5   measurement_status    2020-07-28 20:00:00    start_measurement
...          

我想创建一个 returns 这个视图:

id      start_measurement      stop_measurement
1      2020-07-28 16:00:00    2020-07-28 17:00:00
2      2020-07-28 18:00:00    2020-07-28 19:00:00
...

我该怎么做? 我试过这样做:

CREATE VIEW start_times AS 
   SELECT timestamp AS start_measurements FROM measurement_stat
      WHERE sensor_name = 'measurement_stat' AND value_cal = 'start_measurement'

然后我为 stop_times 做同样的事情。最后,我对刚刚创建的两个视图执行了 LEFT OUTER JOIN。

这行得通,但是有问题。如果出现问题,有时在获取数据时,我们必须停止测量,有时 'stop_measurement' 不会记录。所以有一个 start_measurement 没有关联的 stop_measurement。 这个问题使我的 VIEW 关闭并且列变得不同步。如果这种情况开始经常发生,那么问题只会变得更糟。

在 SQL 中有处理这个问题的方法吗?如果我可以用 NULL 代替 'stop_measurement' 如果有 2 个连续的 'starts' 而在

之间没有 'stop',那就太好了

您可以使用 window 功能。这个想法是在每次满足给定传感器的 'start_measurement' 行时启动一个新组。然后您可以使用此信息对数据进行分组:

create view v_measurement_stat as
select
    sensor_name,
    min(timestamp) start_measurement,
    max(timestamp) filter(where value_cal = 'stop_measurement') stop_measurement
from (
    select 
        ms.*,
        count(*) filter(where value_cal = 'start_measurement')
            over(partition by sensor_name order by timestamp) grp
    from measurement_stat ms
) t
group by sensor_name, grp
order by sensor_name, min(timestamp)