質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Q&A

解決済

1回答

2242閲覧

postgreSQL時系列データの欠損値補完について

tosshu33

総合スコア1

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

0グッド

0クリップ

投稿2020/06/12 04:49

前提・実現したいこと

PostgreSQLで時系列データを取り扱っているのですが、一部欠損値のあるデータが存在します。
この欠損値を補完するために、直近で欠損値がないレコードの値を補完させたいのですが、
どのようにすれば実現できるのかが分かりません・・・

どなたかわかる方いらっしゃいますでしょうか。
よろしくお願いいたします。

発生している問題・エラーメッセージ

--現在の出力結果 survey_date cig_code_curr "201904" 8888 "201905" [null] "201906" [null] "201907" 1833 "201908" [null] "201909" [null] "201910" [null] "201911" [null] "201912" [null] "202001" [null] --求めている出力結果 survey_date cig_code_curr "201904" 8888 "201905" 8888 "201906" 8888 "201907" 1833 "201908" 1833 "201909" 1833 "201910" 1833 "201911" 1833 "201912" 1833 "202001" 1833

該当のソースコード

PostgreSQL

1SELECT survey_date, cig_code_curr 2FROM single_source.test_table2;

試したこと

以下のコードの様にlag関数をうまく利用すれば値が更新されるかなと考えたのですが、うまくいかず・・・

PostgeSQL

1SELECT 2survey_date, 3 4--lag関数を使い、cig_code_currがNULLの場合、一つ上のレコード値を参照し更新 5CASE 6WHEN cig_code_curr IS NULL THEN lag(cig_code_curr, 1, 0) OVER (ORDER BY (survey_date)) 7END 8 9FROM single_source.test_table2; 10 11↓出力結果 12survey_date cig_code_curr 13"201904" 8888 14"201905" [null] 15"201906" [null] 16"201907" 1833 17"201908" [null] 18"201909" [null] 19"201910" [null] 20"201911" [null] 21"201912" [null] 22"202001" [null]

補足情報(FW/ツールのバージョンなど)

OS : windows10 64bit
PostgreSQL : "PostgreSQL 9.6.12 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.9.3, 64-bit"

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2020/06/12 07:00

survey_dateが一意キーなのでしょうか?
tosshu33

2020/06/12 07:21

ご連絡ありがとうございます。 私が持っている実際のテーブルでは本当は複数のキーがあるのですが、 今回は内容簡略化のため、質問ではsurvey_dateを一意のキーとしています。
guest

回答1

0

ベストアンサー

lag()ではoffsetが指定できますが、値が設定されているのが幾つ前か判別できないと意図通りにはなりません。

直近の有効な値を求める対象のデータを判別しておく必要があります。
結果lag()は使用しません。
※with部分はテーブルの疑似データです。実際のデータを使用する場合は不要です。

SQL

1with test_table2 as ( 2 select * from (values 3 ('201904',8888) 4 ,('201905',null) 5 ,('201906',null) 6 ,('201907',1833) 7 ,('201908',null) 8 ,('201909',null) 9 ,('201910',null) 10 ,('201911',null) 11 ,('201912',null) 12 ,('202001',null) 13 ) w(survey_date, cig_code_curr) 14) 15select main.survey_date, coalesce(main.cig_code_curr, sub.cig_code_curr) 16from ( 17 select t1.* 18 ,(select max(survey_date) 19 from test_table2 20 where cig_code_curr is not null and survey_date <= t1.survey_date 21 ) as valid_survey_date 22 from test_table2 t1 23) main 24left join test_table2 sub 25on main.valid_survey_date=sub.survey_date

投稿2020/06/12 07:46

編集2020/06/12 08:02
sazi

総合スコア25186

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tosshu33

2020/06/12 13:25

ありがとうございました。大変助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問