如何解决有没有一种方法可以在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)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。