ローリング平均または移動平均は、移動期間の平均値(過去7日間の平均売上など)を追跡するのに役立つ便利な指標です。時間の経過に伴う移動平均を計算すると、毎日の数値をプロットする場合と比較して、より合理的な傾向が得られます。 Redshiftには移動平均を計算する組み込み関数がないため、これを行うためのSQLクエリを次に示します。
赤方偏移での移動平均の計算方法
Redshiftで移動平均を計算する手順は次のとおりです。 Redshiftの毎日の売上情報を含む次の表があるとします。
# create table sales(order_date date,sale int);
# insert into sales values('2020-01-01',20),
('2020-01-02',25),('2020-01-03',15),('2020-01-04',30),
('2020-01-05',20),('2020-01-10',20),('2020-01-06',25),
('2020-01-07',15),('2020-01-08',30),('2020-01-09',20);
# select * from sales;
+------------+------+
| order_date | sale |
+------------+------+
| 2020-01-01 | 20 |
| 2020-01-02 | 25 |
| 2020-01-03 | 15 |
| 2020-01-04 | 30 |
| 2020-01-05 | 20 |
| 2020-01-10 | 20 |
| 2020-01-06 | 25 |
| 2020-01-07 | 15 |
| 2020-01-08 | 30 |
| 2020-01-09 | 20 |
+------------+------+
過去5日間のRedshiftの移動平均を計算するとします。 Redshift(基本的にPostgresql)は、RedshiftWindowFunctionsの助けを借りてこれを本当に簡単にします。過去5日間の移動平均を計算するSQLクエリは次のとおりです。以下で詳しく見ていきます。
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 ;
結果を丸めたい場合は、図のようにROUND関数を使用して、Redshiftの移動平均を計算できます
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;
order_date | sale | avg_sales
------------+------+---------------
2020-01-01 | 20 | 20.00
2020-01-02 | 25 | 22.50
2020-01-03 | 15 | 20.00
2020-01-04 | 30 | 22.50
2020-01-05 | 20 | 22.00
2020-01-06 | 25 | 23.00
2020-01-07 | 15 | 21.00
2020-01-08 | 30 | 24.00
2020-01-09 | 20 | 22.00
2020-01-10 | 20 | 22.00
上記のクエリを詳しく見てみましょう。 AVG関数は販売の平均値を計算します 桁。ただし、WINDOW関数OVERと一緒に使用すると、定義したウィンドウの平均値のみが計算されます。
まず、データに対してORDER BYを使用して、行が時系列で並べ替えられるようにします。次に、OVER関数を使用して平均のウィンドウを定義し、4つの前の行と現在の行の間の行について説明します。つまり、各行について、前の4行と現在の行の平均を計算します。行ごとにウィンドウフレームが変わるため、過去4日間と現在の日付のみが使用されます。
上記のSQLクエリにWHERE句を追加して、フィルタを追加することもできます。
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;
過去30日/1か月のRedshiftの移動平均を計算する場合は、上記のクエリを変更して、 PRECEDING 29 ROWS AND CURRENT ROWを使用します。
SELECT a.order_date,a.sale,
round(AVG(a.sale)
OVER(ORDER BY a.order_date ROWS BETWEEN 29 PRECEDING AND CURRENT ROW),2) AS avg_sales
FROM sales a;
ボーナスリード:PostgreSQLでピボットテーブルを作成する方法
過去3か月間の赤方偏移の移動平均の計算方法
たとえば、日次データではなく月次売上データがあり、過去3か月の移動平均を計算したいとします。
# create table monthly_sales(order_month date,sale int);
postgres=# insert into monthly_sales values('2019-12-01',20),
('2020-01-30',25),('2020-02-28',15),('2020-03-31',30),
('2020-04-30',20),('2020-05-31',20),('2020-06-30',25),
('2020-07-31',15),('2020-08-31',30),('2020-09-30',20);
postgres=# select * from monthly_sales;
order_month | sale
-------------+------
2019-12-01 | 20
2020-01-30 | 25
2020-02-28 | 15
2020-03-31 | 30
2020-04-30 | 20
2020-05-31 | 20
2020-06-30 | 25
2020-07-31 | 15
2020-08-31 | 30
2020-09-30 | 20
この場合、同じロジックを使用してRedshiftの移動平均を計算します。最初の注文者order_month 行が時系列でソートされていることを確認するための列。次に、 PRECEDING 2 ROWS AND CURRENT ROWの平均を計算します
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 | 20 | 20.00
2020-01-30 | 25 | 22.50
2020-02-28 | 15 | 20.00
2020-03-31 | 30 | 23.33
2020-04-30 | 20 | 21.67
2020-05-31 | 20 | 23.33
2020-06-30 | 25 | 21.67
2020-07-31 | 15 | 20.00
2020-08-31 | 30 | 23.33
2020-09-30 | 20 | 21.67
ボーナスリード:Redshiftで現在の合計を計算する方法
上記の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; 上記のクエリをカスタマイズして、要件に応じてRedshiftの移動平均を計算できます。
Redshiftで移動平均を計算した後、グラフ作成ツールを使用して折れ線グラフにプロットし、チームと共有できます。これは、Ubiqを使用して作成された移動平均を視覚化する折れ線グラフの例です。
Redshiftデータベースからチャート、ダッシュボード、レポートを作成する場合は、Ubiqを試すことができます。 14日間の無料トライアルを提供しています。