🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
PostgreSQL

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

Q&A

2回答

820閲覧

postgresqlで1分前の差を抽出し、差の5分ぶんの平均値を出したい(ウィンドウ関数を使わない)

kmm232306

総合スコア5

PostgreSQL

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

0グッド

0クリップ

投稿2019/11/15 06:48

##前提・実現したいこと
以前同じ内容を質問し、ウィンドウ関数を使用した方法の回答をいただきました。

with t as ( SELECT 日時, 値 , lag(値) OVER (ORDER BY 日時) AS 1つ前の差 , 値 - lag(値) OVER (ORDER BY 日時) AS 差 FROM (values ('2019/10/10 11:22:00'::timestamp, 4980) ,('2019/10/10 11:23:00'::timestamp, 5000) ,('2019/10/10 11:24:00'::timestamp, 5200) ,('2019/10/10 11:25:00'::timestamp, 4980) ,('2019/10/10 11:26:00'::timestamp, 5000) ,('2019/10/10 11:27:00'::timestamp, 5200) ,('2019/10/10 11:28:00'::timestamp, 5100) ) AS t1(日時, 値) ) select * , case when lag(値, 5) OVER (ORDER BY 日時) is not null then (select sum(差)/5 from t where 日時 between (t1.日時 - interval '4 minutes') and t1.日時) end AS 5回分平均 from t as t1

ウィンドウ関数を使わずに上の内容を実現することは可能でしょうか。
PostgreSQLのバージョンが7シリーズで、ウィンドウ関数が使用できない環境です。
よい方法はないでしょうか。

##テーブル構造
![イメージ説明

##実現したい結果
イメージ説明

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

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

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

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

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

guest

回答2

0

こういうことですか?

sql

1select t1.日時, t2.日時 AS "1分前", t1., t2.AS "1分前の値", t2.- t1.AS "差", tt.平均値 2from t_223381 as t1 3left join t_223381 as t2 on t1.日時 = t2.日時 + '1 minute'::interval 4left join ( 5 select t3.日時, sum(t4.) / count(t4.日時) as "平均値" 6 from t_223381 as t3, t_223381 as t4 7 where t4.日時 between t3.日時 + '-4 minutes'::interval and t3.日時 8 group by t3.日時 9) as tt on t1.日時 = tt.日時 10order by t1.日時

実行結果
示されたデータ構造でテーブル t_223381 を作って動かしました。
値が存在する日時をcountで求めて割ることによって、正しく平均値を求めるようにしています。

投稿2019/11/15 09:33

編集2019/11/15 10:28
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

sazi

2019/11/15 13:09 編集

5回に満たないところは平均が出ないのが求めるものの様ですけど。 それと、平均値が違ってますよ。
guest

0

以下はMySQLでのlagやleadの模倣ですけど、postgresでも考え方は同じなので参考に。
MySQLで分析関数を模倣3(後編)

投稿2019/11/15 09:05

sazi

総合スコア25327

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問