以下は、すべてのレコードの期間の開始を取得するための 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)
次へ - 分散が 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 未満のデータを除外する必要がある場合は、3 番目の SELECT から VIEW を作成するだけで済みます。
WHERE (max_temp - min_temp) > 0.2
また、テーブルの代わりに VIEW を使用します。