2016-10-25 11 views
2

天気予報のPostgreSQLテーブルで、最後の雨が降ってからの日数とその日の降雨量を毎日計算しようとしています。私はウィンドウ関数でこれを達成しようとしてきましたが、範囲の制限が無制限であるために、私は少し進んで進んでいませんでした。PostgreSQLで移動天気の統計を計算する

SELECT 
     station_num, 
     ob_date, 
     rain, 
     max(rain) OVER (PARTITION BY station_num ORDER BY ob_date ASC RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as prev_rain_mm, 
     '' as days_since_rain --haven't attempted this calculation yet 
FROM 
     obs_daily_ground_moisture 

これは、次のような結果になります。:

postgres result

が、私はもっとこのような何かを達成しようとしている:

needed postgres result (edited manually)

は、ここで私がこれまで持っているクエリです

窓の機能範囲については、すべての部分がそこにあるように感じる&フィルタとネストされたクエリがありますが、私はそれをすべて一緒に取り出す方法がわかりません。また、上記のデータは実際のデータセットのサブセットに過ぎず、データセット全体がわずか50万行を超えています。

+1

http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on-so-when-asking-a-question/285557# 285557 –

+0

@a_horse_with_no_name私はコードの画像を貼り付けていませんでした。私のコードはコピーして貼り付けることができます。私はテーブルの画像を投稿しました。テーブルを取得するには良い方法があるので、助言してください。私はsqlfiddleでいくつかのサンプルデータとコードを入れていたかもしれませんが、サイトを投稿した時点では、私は達成しようとしていた結果を示したので、テーブルのアップロードされた画像を見ました。 – samuelf

答えて

1

ここで重要なのは、rain> 0値の最初の出現から始まる観測値をrain> 0値の次の出現にグループ化することです。その後、ウィンドウ関数を使用して必要な列を計算することができます。

select 
x.station_num, 
x.ob_date, 
max(rain) over(partition by station_num,col) prev_rain, 
case when rain > 0 then 0 
else row_number() over(partition by station_num, col order by ob_date)-1 end days_since_rain 
from (select t.*, 
     sum(case when rain > 0 then 1 else 0 end) over(partition by station_num order by ob_date) col 
     from t) x 

Sample Demo

+0

ありがとうございましたvkp!以前の雨の値を得るためのアイデアはありますか?私のmax()ウィンドウ関数は、私が – samuelf

+0

以上になっていた限りです。編集されたバージョンを参照してください。内部クエリの 'col'計算は、基本的に雨> 0値の最初の発生から次の雨> 0値の発生までのグループを単一グループにグループ化します。 –

+0

おかげで、編集したバージョンを見る前に、雨の日からあなたのコードを使用してちょっと違った方法で作業しました。 – samuelf

-1

これを試してみてください。

 DECLARE @Rain AS FLOAT 

     UPDATE A 
     SET 
     @Rain = CASE WHEN A.Rain = 0 THEN @Rain ELSE A.Rain END, 
     A.Rain = CASE WHEN @Rain IS NULL OR A.Rain <> 0 THEN A.Rain ELSE @Rain END 
     FROM obs_daily_ground_moisture A 

     SELECT ob_date, Rain, 
     max(rain) OVER (PARTITION BY station_num ORDER BY ob_date ASC RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as prev_rain_mm, 
     ROW_NUMBER() OVER(PARTITION BY Rain ORDER BY ob_date) - 1 as days_since_rain 
     FROM obs_daily_ground_moisture ORDER BY ob_date 
+1

OPはpostgresqlを使用しています。あなたの答えは、MS SQLサーバーのようです – harmic

関連する問題