1

次のようなテーブルがあります。

+------------+------------------+
|temperature |Date_time_of_data |
+------------+------------------+
| 4.5        |9/15/2007 12:12:12|                  
| 4.56       |9/15/2007 12:14:16|
| 4.44       |9/15/2007 12:16:02|
| 4.62       |9/15/2007 12:18:23|
| 4.89       |9/15/2007 12:21:01|
+------------+------------------+

データセットには 1000 を超えるレコードが含まれており、最小の変動性をチェックしたいと考えています。温度の分散が 0.2 を超えない場合、30 分ごとに、その 30 分のすべての温度値を NULL に置き換えます。

4

2 に答える 2

2

以下は、すべてのレコードの期間の開始を取得するための 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 を使用します。

于 2012-11-18T12:26:01.877 に答える