这是一个 SELECT 来获取每条记录的时间段的开始:
SELECT temperature,
Date_time_of_data,
date_trunc('hour', Date_time_of_data)+
CASE WHEN date_part('minute', Date_time_of_data) >= 30
THEN interval '30 minutes'
ELSE interval '0 minutes'
END as start_of_period
FROM your_table
它将日期截断为小时(2007 年 9 月 15 日 12:12:12 到 2007 年 9 月 15 日 12:12:00),然后如果日期最初超过 30 分钟,则添加 30 分钟。
接下来 - 使用 start_of_period 对结果进行分组并获取每个组的最小值和最大值:
SELECT temperature,
Date_time_of_data,
max(Date_time_of_data) OVER (PARTITION BY start_of_period) as max_temp,
min(Date_time_of_data) OVER (PARTITION BY start_of_period) as min_temp
FROM (previou_select_here)
Next - 过滤掉方差大于 0.2 的记录
SELECT temperature,
Date_time_of_data
FROM (previou_select_here)
WHERE (max_temp - min_temp) <=0.2
最后更新你的表
UPDATE your_table
SET temperature = NULL
WHERE Date_time_of_data IN (previous_select_here)
您可能需要更正此查询中的一些拼写错误,然后才能正常工作。我还没有测试过它们。如果需要,您可以简化它们。
PS如果您需要过滤掉方差小于 0.2 的数据,您可以简单地从第三个 SELECT 创建一个 VIEW
WHERE (max_temp - min_temp) > 0.2
并使用 VIEW 代替表。