開発者リファレンス : データ アクセス方法 : SQL Engine Reference : SQL 構文リファレンス : LAG
  
このページをシェアする                  
LAG
LAG は、ウィンドウ関数としてのみ使用できるセット関数です。LAG は、結果セットの現在のパーティションにある前の行から値を取得する場合に使用されます。GROUP BY 集計としては使用できません。
構文
LAG ([, lagオフセット式[, lagデフォルト式]] over)
 
各項目の説明は次のとおりです。
は、結果セット内の行の列または式です。
lagオフセット式は、結果セット内の現在の行から何行前にある行の値を表示するかを示す整数式です。
lagデフォルト式は、現在のパーティション内の lagオフセット式の行がまだ結果セットに累積されていない場合に返すための値です。
以下に示す LAG の例を実行するために、まず次の手順を実行してください。
1 ZenCC の Zen エクスプローラーで[データベース]を右クリックし、次に[新規作成]>[データベース]を選択して一時データベースを作成します。この場合は SAMPLEDB という名前にします。
2 SAMPLEDB を右クリックして[SQL ドキュメント]を選択します。
3 SQL Editor で次の SQL スクリプトを実行して、SAMPLEDB に checkout0 というテーブルを作成します。
create table checkout0 (StartTime TIMESTAMP, LaneNo INTEGER, Items INTEGER, Total MONEY(6,2), Duration INTEGER);
insert into checkout0 values('2021-01-07 22:20:37.852', 1, 7, 18.72, 87);
insert into checkout0 values('2021-01-07 22:22:47.852', 1, 9, 23.45, 107);
insert into checkout0 values('2021-01-07 22:24:57.852', 1, 17, 68.22, 183);
insert into checkout0 values('2021-01-07 22:31:07.852', 1, 12, 48.17, 99);
insert into checkout0 values('2021-01-07 22:33:27.852', 1, 11, 37.77, 77);
insert into checkout0 values('2021-01-07 22:34:39.852', 1, 7, 23.32, 94);
insert into checkout0 values('2021-01-07 22:36:41.852', 1, 14, 56.61, 112);
insert into checkout0 values('2021-01-07 22:19:37.852', 2, 6, 16.72, 80);
insert into checkout0 values('2021-01-07 22:23:47.852', 2, 10, 25.45, 117);
insert into checkout0 values('2021-01-07 22:26:57.852', 2, 18, 72.22, 196);
insert into checkout0 values('2021-01-07 22:31:07.852', 2, 11, 58.17, 109);
insert into checkout0 values('2021-01-07 22:33:47.852', 2, 14, 47.77, 87);
insert into checkout0 values('2021-01-07 22:35:49.852', 2, 9, 27.32, 84);
insert into checkout0 values('2021-01-07 22:37:41.852', 2, 15, 46.16, 122);
insert into checkout0 values('2021-01-07 22:20:07.852', 3, 8, 18.82, 64);
insert into checkout0 values('2021-01-07 22:24:17.852', 3, 8, 19.54, 74);
insert into checkout0 values('2021-01-07 22:27:37.852', 3, 16, 62.44, 131);
insert into checkout0 values('2021-01-07 22:31:37.852', 3, 13, 51.87, 119);
insert into checkout0 values('2021-01-07 22:34:17.852', 3, 12, 37.65, 89);
insert into checkout0 values('2021-01-07 22:36:19.852', 3, 11, 28.23, 86);
insert into checkout0 values('2021-01-07 22:38:11.852', 3, 18, 65.26, 128);
4 これで、レジ精算システムのデータを使用する以下の例を実行する準備ができました。
すべてのウィンドウ関数と同様、結果のデフォルトの順序は、OVER 句で指定されている <partition 列>、<order 列> になります。この順序は、外部 ORDER BY を使用することによって変更できます。
次のクエリは、各 LaneNo が 7 行あることを示します。COUNT(*) を使用して、各行に 1 から 7 の番号を付けることができます。
SELECT LaneNo, StartTime, RowNumInPart FROM (select LaneNo, StartTime, COUNT(*) OVER (PARTITION BY LaneNo ORDER BY StartTime) FROM checkout0) AS T(LaneNo, StartTime, RowNumInPart);
============ 
次のクエリでは、LAG 関数を使用して、現在の行から 3 行前にある行の、RowNumInPart 列で示される値を取得する方法を示します。各パーティションが少なくとも 3 行になるまでは 0 が返されることに注目してください。
SELECT LaneNo, StartTime, RowNumInPart, LAG(RowNumInPart, 3, 0) OVER (PARTITION BY LaneNo ORDER BY StartTime) FROM (select LaneNo, StartTime, COUNT(*) OVER (PARTITION BY LaneNo ORDER BY StartTime) FROM checkout0) AS T(LaneNo, StartTime, RowNumInPart);
============ 
次のクエリは、LAG のデフォルトのオフセットである 1 行を使用して、各パーティション内の連続した 2 つの行ごとの時間差(秒単位)を表示します。
SELECT LaneNo, StartTime, DATEDIFF (SECOND, LAG(StartTime) OVER (PARTITION BY LaneNo ORDER BY StartTime), StartTime) AS Diff_in_secs FROM checkout0;
============ 
次のクエリは、レーン 1 の精算を前の精算と比較することで、精算ごとの品目数の変化を経時的に表示する方法を示します。
SELECT StartTime, LaneNo, Items, Items-LAG(Items) OVER (PARTITION BY LaneNo ORDER BY StartTime) AS delta_items FROM checkout0 WHERE LaneNo = 1;