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

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

詳細はこちら
PostgreSQL

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

Q&A

解決済

1回答

713閲覧

postgresqlで1分前の差を抽出し、差の5回分の平均値を出したい

kmm232306

総合スコア5

PostgreSQL

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

0グッド

0クリップ

投稿2019/10/10 03:03

前提・実現したいこと

postgresqlのクエリで苦労しています。

現在を2019/10/10 11:27:00とした時
毎分の1分前との差を抽出し、それを現在から4回前までの5回分の平均値を出したいです。

・データ構造
テーブル
イメージ説明

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

試したこと

次のSQL文を書いて1分前の差を出すことは出来ましたが、
5回分の平均が出せずに困っています。。
SELECT
日時,
値,
lag(t1.値, 1) OVER (ORDER BY t1.値) AS 1つ前の値,
(t1.値 - lag(値, 1) OVER (ORDER BY t1.日時)) AS 差,
FROM テーブル AS t1

何か良い方法はないでしょうか。

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

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

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

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

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

guest

回答1

0

ベストアンサー

差の累計を求める事で可能です。
単なる累計ならWindow関数の**SUM()**を用いる事で、コストは下げられますが、5分分の累計という限定なので、相関副問合せを用います。

SQL

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

※回答したSQLは5件分=5分分として相違が無いものとしています。
相違があるなら内容は変わります。

投稿2019/10/10 03:48

編集2019/10/10 05:21
sazi

総合スコア25327

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

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

sazi

2019/10/10 15:55 編集

5回分の累計に限定しないと駄目ですね。 ちょっと見直しします。
kmm232306

2019/10/10 14:27

saziさん 回答ありがとうございます。 ご回答の通り実行したところ、実現したいことが解決できました。 ウィンドウ関数の入れ子にしようかと苦労していましたが、 5件分で÷5にすれば良かったんですね。。気づきませんでした汗 大変勉強になりました。 ベストアンサーに選ばせていただきました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問