SourceCode 1.64 KB
1 2 3 4 →

はじめに

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

 本稿では、『分析関数の衝撃6(応用編)』を、PostgreSQL 8.4用にリニューアルした内容を扱います。

対象読者

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

必要な環境

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

  • Oracle
  • DB2
  • SQL Server

1. 複数列のdistinctなcount

 最初は、複数列のdistinctcountを求めるSQLです。まずは、テーブルのデータと、出力結果を考えます。

IDTable
IDColAColB
1abc
2abc
3ab
4ab
5ab

 ColA,ColBの組み合わせのdistinctcountを求めます。(ColA,ColB) = (ab,c),(a,bc),(a,b)で3通りの組み合わせがあるので、これをdisCntとして下記の形で出力します。

出力結果
IDColAColBdisCnt
1abc3
2abc3
3ab3
4ab3
5ab3

 集約関数で、複数列のdistinctcountを取得する方法として、行コンストラクタを使った下記の方法があります。

集約関数で、複数列のdistinctなcount
with tmp(ID,Val1,Val2) as(
values('AA',1,1),
      ('AA',1,1),
      ('AA',2,2),
      ('BB',1,2),
      ('BB',2,1),
      ('BB',2,1),
      ('BB',3,1))
select ID,count(distinct Row(Val1,Val2)) as disCnt
  from tmp
group by ID;
出力結果
IDdisCnt
AA2
BB3

 上記をふまえて、window関数のcount関数で同じようにdistinctオプションを使用すればいいように思えますが、 PostgreSQL 8.4では、window関数でのdistinctオプションが実装されていないので、文法エラーになります。

PostgreSQL 8.4では文法エラー
select ID,ColA,ColB,
count(distinct Row(ColA,ColB)) over() as disCnt
  from IDTable;

ERROR:  DISTINCT is not implemented for window functions
LINE 2: count(distinct Row(ColA,ColB)) over() as disCnt

 答えは、下記の逆ソートを使う方法となります。

逆ソートを使う方法
select ID,ColA,ColB,
-1+dense_rank() over(order by ColA asc ,ColB asc )
  +dense_rank() over(order by ColA desc,ColB desc) as disCnt
  from IDTable
order by ID;

 order by ColA asc,ColB ascでのascは省略可能なのですが、descと対比させたほうが分かりやすいと考え、省略せずに記述しています。

 下記の数式をふまえてdense_rank関数を使っています。-1を加算しているのは、自分を2回数えているからです。

ふまえた数式
-1 + 重複を除いた自分以上の組み合わせの数
   + 重複を除いた自分以下の組み合わせの数
= 重複を除いた組み合わせの数

1 2 3 4
→
INDEX
PostgreSQLの分析関数の衝撃6 (window関数の応用例)
Page1
はじめに
対象読者
必要な環境
1. 複数列のdistinctなcount
2. range指定のcount関数
3. 次の入社日を求める
4. case式とignore nullsオプション
最後に
参考資料
プロフィール
山岸賢治 ヤマギシケンジ

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


注目の求人情報
ビジネス戦略・事業運営/ITベンチャーファーム
コンサルティングやITサービスに関するセールスを行います。また、自分の営業チームをあたかも社内ミニ...
コンサルタント/大手コンサルティングファーム
メーカー・サプライヤー・ビジネスパートナーから最終顧客にいたるサプライチェーンの全体最適化を目的...
技術営業・マーケティング/外資系ソフトウェアベンダー
・金融機関向けソフトウェアセールススペシャリスト (ディレクター/アソシエイトディレクター) ...

(最新日付順)
名前(ゲストの方もコメントをどうぞ):*
アイコン:
なし

内容(テキストのみ1200文字まで):*

投稿規定に同意して

スポンサーサイト

この記事のトラックバックURL: