集約関数
CoddyのSQLジャーニー「基礎」セクションの一部。レッスン 68/72。
OVER (ORDER BY ...)を使うと、AVG()やMAX()などの集計関数は、現在の行までの行(ORDER BYの値が現在の行と同じ行も含む)を対象に計算されます。OVER内にORDER BYがない場合は、すべての行を対象に計算されるため、各行の値は同じになります。
たとえば、各期間の終了時点までの最大収益を計算できます。
| 月 | 収益 | 地域 |
| 4 | 40 | East |
| 5 | 20 | East |
| 6 | 60 | West |
| 7 | 55 | West |
| 8 | 61 | East |
SELECT month, revenue, MAX(revenue) OVER (ORDER BY month ASC) as max_revenue
from table1これは次の値を返します。
| 月 | 収益 | max_revenue |
| 4 | 40 | 40 |
| 5 | 20 | 40 |
| 6 | 60 | 60 |
| 7 | 55 | 60 |
| 8 | 61 | 61 |
4か月目と5か月目の最大収益は40、6か月目と7か月目は60、8か月目は61です。これは、新たにより大きな収益が見つかると、古い値を取り除き、それまでで最大の値を使うためです。
AVG()関数の場合は、次のようになります。
SELECT month, revenue, AVG(revenue) OVER (ORDER BY month ASC) as avg_revenue
from table1| 月 | 売上 | avg_revenue |
| 4 | 40 | 40 |
| 5 | 20 | 30 |
| 6 | 60 | 40 |
| 7 | 55 | 43.75 |
| 8 | 61 | 47.2 |
PARTITION BY を使うと、特定のカテゴリごとに計算をグループ化することもできます。たとえば:
SELECT month, revenue, region,
MAX(revenue) OVER (PARTITION BY region ORDER BY month ASC) as max_revenue
FROM table1次のようになります:
| 月 | 売上 | 地域 | max_revenue |
| 4 | 40 | East | 40 |
| 5 | 20 | East | 40 |
| 6 | 60 | West | 60 |
| 7 | 55 | West | 60 |
| 8 | 61 | East | 61 |
これで、最大値が地域ごとに個別に計算されます。東部地域と西部地域では、それぞれ独立して累積最大値が維持されます。
チャレンジ
簡単利用可能なテーブルと列:
books:book,page,words
各本について、本の名前、総ページ数、各ページの単語数を表示し、次の値を計算してください:
- その本のいずれかのページにある単語数の最大値
- 本全体の1ページあたりの平均単語数
- 現在のページの単語数と、本の1ページあたりの平均単語数との差
本とページ番号の順に結果を表示してください。
次の列を返してください:
bookpagewordsmax_words_in_bookavg_words_per_pagediff_from_avg
自分で試してみよう
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
基礎のすべてのレッスン
自分で練習してみよう: SQLプレイグラウンド