山岸賢治 [著] 2010/02/15 14:00

SourceCode 1.35 KB

 本連載では、分析関数の衝撃シリーズを、PostgreSQL用にアレンジした内容と、OracleやDB2の分析関数をPostgreSQL 8.4で代用する方法を扱います。本稿では、window関数の変わった使用例を扱います。

1 2 3 4 →

はじめに

 2009年7月に正式リリースされたPostgreSQL 8.4で、分析関数(window関数)がサポートされました。本連載では、分析関数の衝撃シリーズを、PostgreSQL用にアレンジした内容と、OracleやDB2の分析関数をPostgreSQL 8.4で代用する方法を扱います。本稿では、window関数の変わった使用例を扱います。

対象読者

  • PostgreSQLでwindow関数を使ってみたい方
  • 分析関数の理解を深めたい方

必要な環境

 本稿で扱うSQLは、PostgreSQL 8.4 beta 2で動作確認しました。その他、次の環境でも応用が可能です。

  • Oracle
  • DB2
  • SQL Server

1. order by句でwindow関数

 まずは、order by句でのwindow関数の使用例です。『PostgreSQLのマニュアル 3.5. ウィンドウ関数』に記述されているように、window関数はselect句とorder by句で使用することができます。サンプルを見てみましょう。

amountData
shopIDdayColamount
1112010-01-01100
1112010-01-12200
1112010-01-13400
1112010-01-2410
2222010-01-01900
2222010-01-12900
3332010-01-01100
3332010-01-12100
3332010-01-23100

 shopIDごとのamountの合計の降順、shopIDの昇順、dayColの昇順に出力してみます。

order by句でwindow関数
select shopID,dayCol,amount
  from amountData
order by sum(amount) over(partition by shopID) desc,
         shopID,dayCol;
出力結果
shopIDdayColamount
2222010-01-01900
2222010-01-12900
1112010-01-01100
1112010-01-12200
1112010-01-13400
1112010-01-2410
3332010-01-01100
3332010-01-12100
3332010-01-23100

 SQLのイメージは下記となります。partition by shopIDで赤線を引いてます。

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

ソートキーを条件分岐

 別のサンプルとして、amountDataテーブルのレコード数が5以上ならamountの降順、shopIDの昇順、dayColの昇順。amountDataテーブルのレコード数が5未満ならshopIDの昇順、dayColの昇順に出力してみます。

order by句でcase式とRow_Number関数
select shopID,dayCol,amount
  from amountData
order by
case when count(*) over() >= 5
     then Row_Number() over(order by amount desc,
                            dayCol,shopID)
     else Row_Number() over(order by shopID,dayCol) end;
出力結果
shopIDdayColamount
2222010-01-01900
2222010-01-12900
1112010-01-13400
1112010-01-12200
1112010-01-01100
3332010-01-01100
3332010-01-12100
3332010-01-23100
1112010-01-2410

 上記のように、order by句でcase式とRow_Number関数を使ってソートキーを条件分岐させることができます。

 別の使用例としては、ソートキーを条件分岐させたいけど、動的SQLではなく、バインド変数を使ったSQLにしたい時なども考えられます。


1 2 3 4
→
INDEX
PostgreSQLの分析関数の衝撃(7) ――window関数の変わった使用例
Page1
はじめに
対象読者
必要な環境
1. order by句でwindow関数
2. update文でwindow関数の値に更新
3. Oracleのkeep指定を模倣
4. Lag関数の引数に行コンストラクタ
最後に
参考資料
プロフィール
山岸賢治 ヤマギシケンジ

Oracle ACEの1人。
OracleSQLパズルの運営者。
ORACLE MASTER Silver Oracle Database 10g
(研修受講で)ORACLE MASTER Gold Oracle Database 10g
ソフトウェア開発技術者 (情報処理技術者試験)
第二種情報処理技術者 (情報処理技術者試験)
 


記事へのコメント・トラックバック機能は2011年6月に廃止させていただきました。記事に対する反響はTwitterやFacebook、ソーシャルブックマークサービスのコメントなどでぜひお寄せください。

スポンサーサイト