sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQLで移動平均を計算する方法

    移動平均またはローリング平均を使用すると、過去7日間などの移動期間の平均を計算できます。時間の経過に伴う移動平均を計算すると、毎日の数値を追跡する場合と比較して、よりスムーズな傾向が得られます。 PostgreSQLで移動平均を計算するためのSQLクエリは次のとおりです。

    PostgreSQLで移動平均を計算する方法

    PostgreSQLで移動平均を計算する方法は次のとおりです。次の表があるとします

    postgres=# create table sales(order_date date,sale int);
    
    postgres=# insert into sales values('2020-04-01',210),
               ('2020-04-02',125),('2020-04-03',150),('2020-04-04',230),
               ('2020-04-05',200),('2020-04-10',220),('2020-04-06',25),
               ('2020-04-07',215),('2020-04-08',300),('2020-04-09',250);
    
    postgres=# select * from sales;
     order_date | sale
    ------------+------
     2020-04-01 |  210
     2020-04-02 |  125
     2020-04-03 |  150
     2020-04-04 |  230
     2020-04-05 |  200
     2020-04-10 |  220
     2020-04-06 |   25
     2020-04-07 |  215
     2020-04-08 |  300
     2020-04-09 |  250
    

    ボーナスリード:PostgreSQLでCSVファイルをインポートする方法

    過去5日間のPostgreSQLの移動平均を計算するとします。 PostgreSQLでは、ウィンドウ関数を使用して移動平均を計算できます。過去5日間のPostgreSQLの移動平均を計算するためのクエリは次のとおりです。詳細を見ていきます

    SELECT a.order_date,a.sale, 
           AVG(a.sale)
           OVER(ORDER BY a.order_date ROWS BETWEEN 4 PRECEDING AND CURRENT ROW)
           AS avg_sales
           FROM sales a ;
     order_date | sale |      avg_sales
    ------------+------+----------------------
     2020-04-01 |  210 | 210.00
     2020-04-02 |  125 | 167.50
     2020-04-03 |  150 | 161.66
     2020-04-04 |  230 | 178.75
     2020-04-05 |  200 | 183.00
     2020-04-06 |   25 | 146.00
     2020-04-07 |  215 | 164.00
     2020-04-08 |  300 | 194.00
     2020-04-09 |  250 | 198.00
     2020-04-10 |  220 | 202.00
    

    上記のクエリでは、AVG関数は saleの平均値を計算します 桁。ウィンドウ関数OVERで使用すると、定義された時間ウィンドウの平均のみが計算されます。

    PostgreSQLで移動平均を計算するには、最初にORDERBY句を使用して行を時系列で並べ替えます。次に、4つの前の行と現在の行の間の行を使用して、平均を計算するためのウィンドウを定義します。これは、各行について、現在の行と前の4行のみの平均を計算することを意味します。したがって、各行について、過去5日間の値のみが考慮されます。

    上記のSQLクエリにWHERE句とROUND関数を追加することで、フィルタを追加して平均値を丸めることもできます。

     SELECT a.order_date,a.sale, 
           round(AVG(a.sale)
           OVER(ORDER BY a.order_date ROWS BETWEEN 4 PRECEDING AND CURRENT ROW),2) 
           AS avg_sales
           FROM sales a
           WHERE condition;

    ボーナスリード:PostgreSQLの月ごとの成長を計算する

    PostgreSQLで30日間の移動平均を計算する方法

    同様に、PostgreSQLで30日間の移動平均を計算する場合は、前の29行と現在の行を考慮して、上記のクエリを変更できます。

    SELECT a.order_date,a.sale, 
           AVG(a.sale)
           OVER(ORDER BY a.order_date ROWS BETWEEN 29 PRECEDING AND CURRENT ROW)
           AS avg_sales
           FROM sales a ;
    

    PostgreSQLで3か月の移動平均を計算する方法

    毎日の売上データがあり、PostgreSQLで3か月の移動平均を計算する場合は、89の前の行と現在の行を考慮して上記のクエリを変更できます。

    SELECT a.order_date,a.sale, 
           AVG(a.sale)
           OVER(ORDER BY a.order_date ROWS BETWEEN 89 PRECEDING AND CURRENT ROW)
           AS avg_sales
           FROM sales a ;
    

    日次データではなく月次データがあり、過去3か月の移動平均を計算したいとします

    postgres=# create table monthly_sales(order_month date,sale int);
    
    postgres=# insert into monthly_sales values('2019-12-01',120),
               ('2020-01-30',250),('2020-02-28',150),('2020-03-31',300),
               ('2020-04-30',200),('2020-05-31',200),('2020-06-30',250),
               ('2020-07-31',150),('2020-08-31',300),('2020-09-30',200);
    
    postgres=# select * from monthly_sales;
     order_month | sale
    -------------+------
     2019-12-01  |  120
     2020-01-30  |  250
     2020-02-28  |  150
     2020-03-31  |  300
     2020-04-30  |  200
     2020-05-31  |  200
     2020-06-30  |  250
     2020-07-31  |  150
     2020-08-31  |  300
     2020-09-30  |  200
    

    ボーナスリード:SQLで保持率を計算する方法

    上記と同じロジックを使用して、PostgreSQLの移動平均を計算します。まず、行を時系列で並べ替えてから、OVERウィンドウ関数を使用して前の2行の平均を計算します。 および現在の行

    SELECT a.order_month,a.sale,
            round(AVG(a.sale)
            OVER(ORDER BY a.order_month ROWS BETWEEN 2 PRECEDING AND CURRENT ROW),2) 
            AS avg_sales
            FROM monthly_sales a ;
    
     order_month | sale | avg_sales
    -------------+------+-----------
     2019-12-01  |  120 |    120.00
     2020-01-30  |  250 |    185.00
     2020-02-28  |  150 |    173.33
     2020-03-31  |  300 |    233.33
     2020-04-30  |  200 |    216.67
     2020-05-31  |  200 |    233.33
     2020-06-30  |  250 |    216.67
     2020-07-31  |  150 |    200.00
     2020-08-31  |  300 |    233.33
     2020-09-30  |  200 |    216.67
    
    

    ボーナスリード:PostgreSQLでピボットテーブルを作成する方法

    上記のSQLクエリにWHERE句を含めることで、フィルタを追加することもできます。

     SELECT a.order_month,a.sale,
            round(AVG(a.sale)
            OVER(ORDER BY a.order_month ROWS BETWEEN 2 PRECEDING AND CURRENT ROW),2) 
            AS avg_sales
            FROM monthly_sales a
            WHERE condition;

    上記のクエリをカスタマイズして、要件に応じてPostgreSQLの移動平均を計算できます。

    PostgreSQLで移動平均を計算した後、グラフ作成ツールを使用して折れ線グラフにプロットし、チームと共有できます。これは、Ubiqを使用して作成された移動平均を視覚化する折れ線グラフの例です。

    PostgreSQLデータベースからチャート、ダッシュボード、レポートを作成したい場合は、Ubiqを試すことができます。 14日間の無料トライアルを提供しています。


    1. PDO ::__ Construct():サーバーがクライアントに不明な文字セット(255)を送信しました。開発者に報告してください

    2. SQL ServerのCONVERT()とTRY_CONVERT:違いは何ですか?

    3. JSON配列内の要素を検索するためのインデックス

    4. 2つのDjangoアプリ間でモデルを移動する方法(Django 1.7)