有没有办法在 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)
我有一个名为 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)