ウィンドウ集約

ウィンドウ集約 (ウィンドウ解析関数ともいう) を使用すると、ウィンドウによって定義される行グループに基づいて集約値を計算できます。 ウィンドウは、システムが計算を実行するために使用する行の範囲を決定します。

ウィンドウのサイズは、物理的な行数、または論理的インターバル (過去 1 年間、四半期など) に基づいて決定できます。 ウィンドウ集約を使い、累積、移動、集中、報告の集約を計算することが可能です。 ウィンドウ集約では、グループ集約と違って、行の情報が保持されます。

例えば、以下のような月次の販売情報を記録した monthlysales という表があるとします。
 YEAR | MONTH | SALESK
------+-------+--------
 2007 |    10 |     20
 2007 |    11 |     22
 2007 |    12 |     25
 2008 |     1 |     30
 2008 |     2 |     35
 2008 |     3 |     50
 2008 |     4 |     70
(7 rows)
ウィンドウ集約を使用すると、さまざまな移動期間について、各種の集計を行うことができます。 例えば、以下の照会では、総売上高の 3 カ月の移動平均を求めています。
MYDB.SCHEMA(USER)=> SELECT year, month, salesk, avg(salesk) OVER 
(PARTITION BY year ORDER BY month ROWS BETWEEN 1 PRECEDING AND 1 
FOLLOWING) FROM monthlysales; 
 YEAR | MONTH | SALESK |    AVG
------+-------+--------+-----------
 2007 |    10 |     20 | 21.000000
 2007 |    11 |     22 | 22.333333
 2007 |    12 |     25 | 23.500000
 2008 |     1 |     30 | 32.500000
 2008 |     2 |     35 | 38.333333
 2008 |     3 |     50 | 51.666667
 2008 |     4 |     70 | 60.000000
(7 rows)

出力には各行の結果が記載されます。AVG の値は、前月、当月、翌月の売上値の移動平均です。 先頭行については、前月がないため、当月と翌月にのみ基づいて平均が計算されます。 同様に、最後の行の平均は、前月と当月のみの平均です。

以下の例では、総売上高の累計を計算しています。
MYDB.SCHEMA(USER)=> SELECT *, sum(salesk) OVER (PARTITION BY year ORDER BY 
month ROWS UNBOUNDED PRECEDING) FROM monthlysales; 
 YEAR | MONTH | SALESK | SUM
------+-------+--------+-----
 2007 |    10 |     20 |  20
 2007 |    11 |     22 |  42
 2007 |    12 |     25 |  67
 2008 |     1 |     30 |  30
 2008 |     2 |     35 |  65
 2008 |     3 |     50 | 115
 2008 |     4 |     70 | 185
(7 rows)

出力には各行の結果が含まれており、SUM 値は、表内の各月の時点で総売上高を示しています (前月までの累計と当月の合計)。