SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

分析関数の衝撃

PostgreSQLの分析関数の衝撃(7)
――window関数の変わった使用例

order by句でのwindow関数など

  • X ポスト
  • このエントリーをはてなブックマークに追加

ダウンロード SourceCode (1.3 KB)

4. Lag関数の引数に行コンストラクタ

 最後は、Lag関数の引数に行コンストラクタを使うSQLです。『PostgreSQLの分析関数の衝撃6』で、『4.2.12. 行コンストラクタ』を少し紹介しましたが、今度はLag関数の引数に行コンストラクタを使ってみます。サンプルを見てみましょう。

LagTest
SortKey Val1 Val2
10 1 5
12 3 7
14 3 7
15 1 5
19 3 7
25 3 5
30 3 5

 SortKeyの昇順で、前の行とVal1が等しく、かつ前の行とVal2が等しいかをチェックした結果を列別名PrevIsSameとして表示します。

出力結果
SortKey Val1 Val2 PrevIsSame
10 1 5 0
12 3 7 0
14 3 7 1
15 1 5 0
19 3 7 0
25 3 5 0
30 3 5 1

 case式とLag関数を組み合わせて、答えは下記となります。

Lag関数を2回使用
select SortKey,Val1,Val2,
case when Val1 = Lag(Val1) over(order by SortKey)
      and Val2 = Lag(Val2) over(order by SortKey)
     then 1 else 0 end as PrevIsSame
from LagTest;

 SQLのイメージは下記となります。Lag(Val1) over(order by SortKey)に対応する黄緑線と、Lag(Val2) over(order by SortKey)に対応する青線を引いてます。

SQLのイメージ
SQLのイメージ

 Lag関数を2回ではなく、1回で済ませたいと思ったら、下記の行コンストラクタを使用したSQLの出番です。行コンストラクタは『C#の匿名型』と似たようなものと考えると分かりやすいかもしれません。

Lag関数の引数に行コンストラクタ
select SortKey,Val1,Val2,
case when Row(Val1,Val2)
    = Lag(Row(Val1,Val2)) over(order by SortKey)
     then 1 else 0 end as PrevIsSame
from LagTest;

 SQLのイメージは下記となります。Lag(Row(Val1,Val2)) over(order by SortKey)に対応する黄緑線を引いてます。

SQLのイメージ
SQLのイメージ

 このように行間比較する列が複数の場合は、行コンストラクタを使用するとSQLがシンプルになることがあります。

最後に

 本稿では、window関数の変わった使用例を扱いました。次回は、OracleやDB2の分析関数のRows指定とRange指定をPostgreSQL 8.4で代用する方法を扱います。

参考資料

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
分析関数の衝撃連載記事一覧

もっと読む

この記事の著者

山岸 賢治(ヤマギシ ケンジ)

趣味が競技プログラミングなWebエンジニアで、OracleSQLパズルの運営者。AtCoderの最高レーティングは1204(水色)。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/4790 2010/02/15 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング