🙆‍♀️

ウィンドウ関数と集約関数の違い(出力結果に注目する)

に公開

ウィンドウ関数を初めて使った際に戸惑うのが、その実行結果です。通常の集約関数と違い、個別の計算をしながら列全体に結果を出力できます。

本記事では、ウィンドウ関数の出力結果に注目をしながらその特徴をご紹介します

概要(Weightsテーブル)

具体例としてWeightsテーブルをご用意しました。6人の学生の体重が記載されたテーブルとなっています。

student_id weight
A 55
B 70
C 65
D 120
E 83
F 63

こちらのテーブルを元に、ウィンドウ関数の仕組みを学びます。同じテーブルを作成したい方は、こちらからコードを確認してみてください。

ウィンドウ関数の基本的な使い方

先ほどのテーブルに対して、AVG関数を「ウィンドウ関数として」実行してみます。OVER句はウィンドウ関数として使うことの宣言だと思ってください。

SELECT *, AVG(weight) OVER () FROM Weights;

実行結果は次のようになります。avgという新しい列が追加された点に注目してください。

 student_id | weight |         avg
------------+--------+---------------------
 A          |     55 | 76.0000000000000000
 B          |     70 | 76.0000000000000000
 C          |     65 | 76.0000000000000000
 D          |    120 | 76.0000000000000000
 E          |     83 | 76.0000000000000000
 F          |     63 | 76.0000000000000000

ウィンドウ関数には、**元データを参照して計算を行い、その結果を新しい列として追加する機能があります。**そのためここでは、AVG関数の計算結果(平均値の値)を新しい列へ出力しています。

集約関数とウィンドウ関数の違い

ウィンドウ関数を使うことで、①個別の計算 と ②全体への出力 の2つが同時にできる点を見てきました。

ここでお伝えしたいのは、同じAVG関数でありながらも、集約関数として使うか?ウィンドウ関数として使うか?によって、出力結果が異なることです。

  • 集約関数:集約するので結果は1つ
  • ウィンドウ関数:範囲全体に計算を行い、結果は複数

集約関数の特徴

通常の集約関数は、複数の行をまとめて1つの結果を返します。例えば先ほどのテーブルに対して「通常の」AVG関数を使うと、次のような結果が出てきます。

SELECT AVG(weight) FROM Weights;
         avg
---------------------
 76.0000000000000000

「76」という値のみが出力されました。個別の行やテーブルのデータが失われている点に注目してください。

集約関数にはその名の通り、**複数のモノを1つにまとめる特徴があります。**そのため平均された結果のみが残り、裏を返せば、他のモノは残らない仕組みとなっています。

ウィンドウ関数の特徴

一方、ウィンドウ関数は個別の計算結果を全体に出力できます。

SELECT *, AVG(weight) OVER() FROM weights;
 student_id | weight |         avg
------------+--------+---------------------
 A          |     55 | 76.0000000000000000
 B          |     70 | 76.0000000000000000
 C          |     65 | 76.0000000000000000
 D          |    120 | 76.0000000000000000
 E          |     83 | 76.0000000000000000
 F          |     63 | 76.0000000000000000

元データ全体に計算を行いながら、各行に計算結果が出力されていますよね。個別データを保持しながら集約結果も参照できるのが、ウィンドウ関数の最大の特徴となっています。

まとめ

出力結果に注目して、ウィンドウ関数の仕組みをご説明しました。活用場面や「なぜその仕組みになっているか?」という点については、また別の記事でご紹介させていただければと思います!

Discussion