【问题标题】:Is there a way to fill in missing data points with NULL in SQL VIEWs?有没有办法在 SQL VIEW 中用 NULL 填充缺失的数据点?
【发布时间】:2020-12-07 02:07:28
【问题描述】:

我有一个名为 measure_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
...          

我想创建一个返回这个的视图:

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 做同样的事情。最后,我对刚刚创建的两个 VIEW 执行了 LEFT OUTER JOIN。

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

有没有办法在 SQL 中处理这个问题?如果有 2 个连续的“开始”而中间没有“停止”,我可以用 NULL 代替“stop_measurement”,那就太好了

【问题讨论】:

  • 如果有两个连续的stop_measurement记录你想要什么?
  • 这种情况不太可能发生,因为我们只能在测量开始时停止测量。但是,如果发生这种情况,我想在 2 个 stop_measurement 记录之间为 start_measurement 填写一个 NULL。

标签: sql postgresql window-functions gaps-and-islands sql-view


【解决方案1】:

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

【讨论】:

  • 非常感谢!!这在我过滤掉了几个我没有提到的其他传感器名称后起作用了。
猜你喜欢
  • 2019-06-17
  • 2020-03-07
  • 2022-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多