【BigQuery】LAG関数の使い方とは?レコードを比較して差分を求める方法を紹介

BigQuery_LAG関数 クラウドプラットフォーム

LAG関数を使うと分析の幅が広がります。

例えば「1つ前のレコードとの差分を求めたい」など複雑な分析に役立つでしょう。

初めてLAG関数を見ると引数が多くて苦手意識を持つかもしれません。
しかしよく観察するとそれほど複雑な関数でないことが分かります。

今回は1つ前のレコードと比較するLAG関数について紹介します。

サンプルデータ 〜美術館の入場者数で分析する〜

ここに美術館の入場者数データがあります。
前日と比較して何人増減しているか把握できるカラムを追加しましょう。

入場者数を出力する|クリックして拡大できます

LAG関数を使ってみる

LAG関数はこのように使います。

LAG (対象カラム, nレコード分だけ下にずらす) OVER( [PARTITION BY ~] ORDER BY ~ )

LAG関数を使うとn個だけレコード数をずらして対象カラムを追加できます。
それでは前日の入場者数が入ったカラムを追加しましょう。

前日の入場者数カラムを追加する

LAG関数を使ってカラムを追加する|クリックして拡大できます
SELECT
  date AS `日付`,
  num AS `1日の入場者数`,
  LAG(num, 1) OVER(ORDER BY date ASC) AS `前日の入場者数`
FROM
  `sql-book-384011.sample.20230722_musium`
ORDER BY
  date asc

3列目に「前日の入場者数」が追加されました。
2行目を見ると、2023-07-20の「1日の入場者数」である「1000」 が入っていますね。

続いて「前日と当日の入場者数の差分」と「増減率」を求めてみましょう。

「前日と当日の入場者数の差」と「増減率」を求める

LAG関数を使って前日と当日の差分を計算する|クリックして拡大できます
SELECT
  date AS `日付`,
  num AS `1日の入場者数`,
  LAG(num, 1) OVER(ORDER BY date ASC) AS `前日の入場者数`,
  num - LAG(num, 1) OVER(ORDER BY date ASC) AS `前日と当日の入場者数の差分`,
  ROUND((num - LAG(num, 1) OVER(ORDER BY date ASC)) / (LAG(num, 1) OVER(ORDER BY date ASC)), 2) * 100 AS `増減率`
FROM
  `sql-book-384011.sample.20230722_musium`
ORDER BY
  date asc

複雑そうなクエリに見えますが

  • 「1日の入場者数」を1レコードずらす
  • 新しいカラムとして追加する
  • その差分と比率を求める

やっていることは以上です。
「あるレコードとの差分を求めること」はよくある分析でしょう。
そんなときはLAG関数を使ってみましょう!

他にもLAG関数についてまとめた記事があるので合わせてご覧ください。

LAG関数を使いログデータを分析する方法を紹介

まとめ

LAG関数いかがだったでしょうか。
指定する条件もあって初めはちょっと使いづらいですよね。

LAG関数を使えるとレコードの差分を求められるようになるため分析の幅が広がること間違いなしです。

これを機会にマスターしましょう!