SQL lag() 関数を使用すると、特定のオフセットで現在の行から前の行にアクセスできます。つまり、lag() 関数を使用すると、現在の行から前の行にアクセスできるようになります。オフセット値を指定すると、現在の行から前の 1、2、3 行などにアクセスできます。
これは、後続の行にアクセスできる lead() 関数の逆です。
SQL ラグ()
関数の構文は次のとおりです。
LAG(値式, オフセット [, デフォルト])
以上 (
[PARTITION BY パーティション式]
ORDER BY 並べ替え式 [ASC |説明]
);
サポートされている引数は次のとおりです。
- 値の式 – 前の行の戻り値を指定します。式は単一の値に評価される必要があります。
- オフセット – 現在の行から何行遡ってアクセスするかを指定します。
- デフォルト – オフセットがパーティションの範囲外にある場合は、デフォルト値を設定します。デフォルトでは、値は NULL に設定されます。
- パーティション分割 – データを分割する方法を指定します。
- 注文方法 – 各パーティション内の行の順序形式を設定します。
サンプルデータのセットアップ
lag() 関数の仕組みに入る前に、デモ用に基本的なテーブルを設定することから始めましょう。
CREATE TABLE 製品 (
product_id INT 主キー AUTO_INCREMENT、
製品名 VARCHAR(255)、
カテゴリ VARCHAR(255)、
価格 DECIMAL(10, 2),
数量INT、
有効期限 DATE、
バーコード BIGINT
);
入れる
の中へ
製品 (製品名、
カテゴリー、
価格、
量、
有効期限、
バーコード)
値 ('シェフハット 25cm',
'ベーカリー'、
24.67、
57、
'2023-09-09',
2854509564204);
入れる
の中へ
製品 (製品名、
カテゴリー、
価格、
量、
有効期限、
バーコード)
値 ('うずらの卵 - 缶詰',
'パントリー'、
17.99、
67、
'2023-09-29',
1708039594250);
入れる
の中へ
製品 (製品名、
カテゴリー、
価格、
量、
有効期限、
バーコード)
値 ('コーヒー - エッグ ノッグ カプチーノ',
'ベーカリー'、
92.53、
10、
'2023-09-22',
8704051853058);
入れる
の中へ
製品 (製品名、
カテゴリー、
価格、
量、
有効期限、
バーコード)
値 ('梨 - とげのある',
'ベーカリー'、
65.29、
48、
'2023-08-23',
5174927442238);
入れる
の中へ
製品 (製品名、
カテゴリー、
価格、
量、
有効期限、
バーコード)
値 ('パスタ - エンジェル ヘア',
'パントリー'、
48.38、
59、
'2023-08-05',
8008123704782);
入れる
の中へ
製品 (製品名、
カテゴリー、
価格、
量、
有効期限、
バーコード)
値 ('ワイン - プロセッコ ヴァルドビアッデネ',
'生産する'、
44.18、
3、
'2023-03-13',
6470981735653);
入れる
の中へ
製品 (製品名、
カテゴリー、
価格、
量、
有効期限、
バーコード)
値 ('ペストリー - フレンチ ミニ盛り合わせ',
'パントリー'、
36.73、
52、
'2023-05-29',
5963886298051);
入れる
の中へ
製品 (製品名、
カテゴリー、
価格、
量、
有効期限、
バーコード)
値 ('オレンジ - 缶詰、マンダリン',
'生産する'、
65.0、
1、
'2023-04-20',
6131761721332);
入れる
の中へ
製品 (製品名、
カテゴリー、
価格、
量、
有効期限、
バーコード)
値 ('豚肩肉',
'生産する'、
55.55、
73、
'2023-05-01',
9343592107125);
入れる
の中へ
製品 (製品名、
カテゴリー、
価格、
量、
有効期限、
バーコード)
values ('Dc Hikiage Hira Huba',
'生産する'、
56.29、
53、
'2023-04-14',
3354910667072);
データの作成と設定が完了したら、いくつかの例について説明していきます。
例 1: 基本的な使用法
この場合、製品情報を含む「製品」テーブルにアクセスできます。現在の行から前のバーコードを取得するとします。
lag() 関数は次のように使用できます。
選択する商品名、
価格、
ラグ(バーコード)オーバー(カテゴリごとに分割)
までに注文する
価格は昇順)、previous_item と同じ
から
製品p;
指定されたコードは、カテゴリに基づいてデータを分割します。次に、lag() 関数を使用してパーティション内の前のバーコードをフェッチします。
結果の出力は次のようになります。
例 2: デフォルト値の設定
特定の列に前の行がない場合 (範囲外)、関数は前の例で示したように値を NULL に設定します。
スコープ外のアクセスにデフォルト値を設定するには、次の手順を実行します。
選択する商品名、
価格、
lag(barcode, 1, 'N/A') over (カテゴリ別のパーティション)
までに注文する
価格は昇順)、previous_item と同じ
から
製品p;
デフォルト値を「N/A」に設定します。これにより、出力に示されているように、範囲外の値が置き換えられます。
例 3: カスタム オフセット値
現在の行から前の 2 行にアクセスするとします。これを行うには、オフセット値を 2 に設定します。
クエリの例を以下に示します。
選択する商品名、
価格、
lag(barcode, 2, 'N/A') over (カテゴリ別のパーティション)
までに注文する
価格は昇順)、previous_item と同じ
から
製品p;
出力:
このクエリは、各パーティションの前の 2 行を返します。
結論
このチュートリアルでは、lag() 関数を使用して現在の行から前の項目を取得する方法を学びました。