有没有一种方法可以在SQL VIEW中用NULL填充丢失的数据点?

问题描述

我有一个名为Measurement_stat的表,其格式如下:

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

我想创建一个返回以下内容的VIEW:

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”不会记录。因此,存在一个没有关联的stop_measurement的start_measurement。 这个问题使我的VIEW失效,列不同步。如果这种情况经常发生,那么问题只会变得更加复杂,甚至更加严重。

是否可以在SQL中处理此问题?如果两个连续的“开始”之间没有“停止”,那么我可以用空值代替“ stop_measurement”,那就太好了

解决方法

您可以使用窗口功能。这个想法是每次给定传感器遇到'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)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...