Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】SQL Window Functions 101

2026年09月12日に「Dev.to」が公開したITニュース「SQL Window Functions 101」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

SQL Window Functionsは、個々の行を保持したまま、関連する複数行(ウィンドウ)に対して計算を行う機能だ。OVER句でグループ化や順序を指定し、ランキング、累計、平均、前後行の値取得など高度な分析ができる。データ分析やレポート作成に活用され、行数を減らさずに分析能力を高める。

出典: SQL Window Functions 101 | Dev.to公開日:

ITニュース解説

SQLのWindow Functionsは、データ分析において非常に強力な機能である。この機能は、現在の行に関連する「窓(ウィンドウ)」と呼ばれる行の集合に対して計算を実行するために使用される。従来の集計関数、例えばSUM()やAVG()、COUNT()といったものは、複数の行をまとめて一つの結果として出力する。これに対し、Window Functionsは個々の行はそのまま保持しつつ、計算された値を追加するという点で大きく異なる。

Window Functionsは、データの集計、順位付け、累積合計の計算といった分析タスクで頻繁に利用される。この機能の中心にあるのが「OVER句」であり、これが計算対象となる行の「窓」を定義する役割を担う。OVER句の中では、データをどのように分割し、その中でどのように並べ替えるかを指定できる。

具体的には、「PARTITION BY」句を使用すると、データを特定の列の値に基づいて複数のグループに分割できる。例えば、ドライバーIDでPARTITION BYを指定すれば、ドライバーごとの独立したグループが作られる。そして、「ORDER BY」句は、そのグループ内でさらに行の順序を指定する。これにより、各グループ内で計算が実行される順序が決定される。PARTITION BYとORDER BYを組み合わせることで、SUM()、AVG()、ROW_NUMBER()、RANK()、DENSE_RANK()といった様々な関数を、非常に制御された方法で適用することが可能になる。

SQL Window Functionsは、大きく分けて「ランキングWindow Functions」と「集計Window Functions」、そして「値ベースの関数」の3種類がある。

まず、ランキングWindow Functionsについて説明する。これらの関数は、指定されたパーティション(グループ)内で、特定の条件に基づいて行に順位を付与する。

「ROW_NUMBER()」は、各行に一意の連番を順番に割り当てる。例えば、ドライバーごとのトリップに、古い順から1, 2, 3...と連番を振りたい場合に利用できる。この関数は、ドライバーIDでパーティションを分け、トリップIDや日付で順序付けすることで、各ドライバーの各トリップに一意の番号を付与することが可能である。

「RANK()」は、順位を割り当てるが、同じ値を持つ行には同じ順位を付与し、その次の順位が飛ぶという特徴がある。例えば、ドライバーのランキングを作成する際に、同着のドライバーがいれば同じ順位が与えられ、次のドライバーの順位は同着の人数分だけスキップされる。

「DENSE_RANK()」もRANK()と同様に同じ値を持つ行に同じ順位を付与するが、RANK()とは異なり、順位が途中で飛ぶことなく連続した順位を割り当てる。例えば、社員の給与を部署ごとに降順でランク付けする場合、同じ給与の社員には同じ順位が与えられるが、次の順位はギャップなく続くため、より密なランキングを得られる。

「NTILE(n)」は、指定された数の「バケツ」にデータを均等に分割する。例えば、NTILE(4)を使用すると、データを四分位(クォータイル)に分割できる。これは、顧客の総支出額を降順で並べ替え、上位25%の顧客、次の25%の顧客、といった形でグループ分けする際に有用である。

次に、集計Window Functionsについて説明する。これらの関数は、個々の行を保持しながら、行の「窓」の範囲で集計計算を実行する。

「SUM()」は、パーティション内の行に対して累積合計を計算する。例えば、特定のライダー(顧客)のトリップごとの料金を順番に加算し、その時点までの合計料金(累積支出額)を各トリップ行に追加表示することができる。

「AVG()」は、パーティション内の行に対して平均値を計算する。例えば、ライダーごとのトリップ料金の移動平均を計算し、各トリップ行にその時点での平均料金を表示する場合に利用できる。

「COUNT()」は、パーティション内の行数を数える。例えば、特定のドライバーの全てのトリップ数をカウントし、その数を各トリップ行に表示するといった使い方が可能である。OVER句に何も指定しない場合、テーブル全体の行数をカウントすることになる。

最後に、値ベースの関数について説明する。これらの関数は、現在の行の「窓」内の他の行から値を取得する。

「LAG()」は、現在の行よりも前の行から値を取得する。例えば、あるドライバーのトリップ履歴を日付順に並べた際に、現在のトリップの料金に加えて、その前のトリップの料金を取得し、比較分析する際に非常に役立つ。

「LEAD()」は、現在の行よりも後の行から値を取得する。LAG()とは逆に、特定のライダーのトリップ履歴を日付順に並べた際に、現在のトリップの評価に加えて、次のトリップの評価を取得するといった用途で使用できる。これにより、将来のデータとの比較や予測的な分析が可能になる。

「FIRST_VALUE()」は、現在の「窓」(パーティション)内の最初の行の値を返す。例えば、ドライバーごとのトリップ履歴の中で、そのドライバーの最も古いトリップの料金を取得する場合に利用できる。

「LAST_VALUE()」は、現在の「窓」(パーティション)内の最後の行の値を返す。例えば、特定のトリップIDに関するデータの中で、日付順で最も新しい(最後の)料金を取得するような場合に有用である。

SQL Window Functionsは、このように行の数を減らすことなく、データ分析の能力を大幅に向上させる。これらの関数は、レポート作成、トレンド分析、複雑なランキング操作など、多岐にわたるデータ処理で活用されており、システムエンジニアとしてデータを取り扱う上で理解しておくべき重要な機能である。

関連コンテンツ