Oracle SQLでは、同じ結果セット内にある前後の行の値を比較したい場面があります。例えば、売上データの前月比を計算したり、時系列データの変化を確認したりする場合です。このような処理では、分析関数のLAG関数とLEAD関数が利用されます。
LAGとLEADは、SQLの結果セットを並び順に基づいて参照し、現在の行から見て前の行や次の行の値を取得できる便利な関数です。この記事では、それぞれの特徴や使い方、具体的な利用例について詳しく解説します。
Oracle SQLで前後の行を参照する関数はLAGとLEAD
Oracleの分析関数で、同一結果セット内の前の行や次の行の値を取得する関数ペアは「LAG関数」と「LEAD関数」です。
LAG関数は現在の行より前にある行の値を取得し、LEAD関数は現在の行より後ろにある行の値を取得します。
| 関数 | 取得する値 | 主な用途 |
|---|---|---|
| LAG | 前の行の値 | 前回データとの比較 |
| LEAD | 次の行の値 | 次回データの参照 |
通常のSQLでは、前後の行を取得するために自己結合など複雑な処理が必要になることがありますが、LAGとLEADを使うことで簡潔なSQLを書くことができます。
LAG関数で前の行の値を取得する方法
LAG関数は、現在の行から指定した数だけ前にある行の値を取得します。基本的な構文は以下のようになります。
LAG(列名, 取得する行数, デフォルト値) OVER (ORDER BY 並び順の列)
例えば、売上テーブルから前日の売上を取得する場合は以下のように記述します。
SELECT 売上日, 売上金額, LAG(売上金額,1) OVER(ORDER BY 売上日) AS 前日の売上 FROM 売上テーブル;
この場合、各行に対して1つ前の日付の売上金額が表示されます。1行目には比較対象となる前のデータが存在しないため、NULLが返されます。
例えば、以下のようなデータの場合、LAGを使うことで前回との差分計算が可能になります。
| 日付 | 売上 | 前日の売上 |
|---|---|---|
| 1月1日 | 100 | NULL |
| 1月2日 | 150 | 100 |
| 1月3日 | 120 | 150 |
LEAD関数で次の行の値を取得する方法
LEAD関数は、現在の行より後にあるデータを取得するための分析関数です。構文はLAG関数とほぼ同じで、参照方向だけが異なります。
LEAD(列名, 取得する行数, デフォルト値) OVER (ORDER BY 並び順の列)
例えば、次回の予定日や次月の売上を取得したい場合にはLEADを利用します。
SELECT 月, 売上金額, LEAD(売上金額,1) OVER(ORDER BY 月) AS 次月の売上 FROM 売上テーブル;
このSQLでは、現在の行から1つ後の売上データを取得できます。最後の行には次のデータが存在しないためNULLになります。
LAGとLEADを使った実践的な利用例
LAGとLEADは、時系列データの分析で特によく利用されます。例えば、毎日のアクセス数や商品の販売数を比較する場合などです。
具体例として、月ごとの売上データから前月比を計算する場合、LAG関数で前月売上を取得し、現在の売上との差を求めることができます。
SELECT 月, 売上金額, 売上金額-LAG(売上金額) OVER(ORDER BY 月) AS 前月との差 FROM 売上テーブル;
また、勤務表や予約管理システムでは、LEAD関数を使って次回予定や次のイベントまでの期間を計算することもできます。
PARTITION BYを使ったグループ別の前後比較
LAGやLEADでは、OVER句にPARTITION BYを指定することで、グループ単位で前後のデータを比較できます。
例えば、社員ごとの売上履歴を管理している場合、社員ごとに分けて前回売上を取得できます。
SELECT 社員ID, 月, 売上金額, LAG(売上金額) OVER(PARTITION BY 社員ID ORDER BY 月) AS 前月売上 FROM 売上テーブル;
このようにPARTITION BYを利用すると、異なる社員のデータが混ざることなく、それぞれのグループ内で正しく前後比較できます。
LAGとLEADを利用するときの注意点
LAGやLEADは非常に便利ですが、取得する順番を決めるORDER BYの指定が重要です。並び順が正しくない場合、意図しない行を参照してしまいます。
例えば、日付順に比較したい場合は必ず日付列をORDER BYに指定する必要があります。単純にテーブル登録順で処理すると、正しい前後関係にならない可能性があります。
また、先頭行や末尾行では参照するデータが存在しないためNULLになる点も考慮してSQLを設計する必要があります。
まとめ
Oracle SQLの分析関数で、同一結果セット内の前の行や次の行を参照する関数ペアはLAG関数とLEAD関数です。
LAGは前の行、LEADは次の行の値を取得するため、売上比較や時系列分析、変化量の計算など幅広い場面で活用できます。
ORDER BYやPARTITION BYを適切に組み合わせることで、複雑な自己結合を使わずに効率的なSQLを作成できるため、Oracleでデータ分析を行う際にはぜひ覚えておきたい機能です。


コメント