partition by を使って、ORACLEで、グループ毎に1行だけ取得する。

投稿日:

グループ単位で一番小さいとか、一番大きいとかだけなら、MinやMaxを使って外部結合で対応できるんだけど、1番目2番目3番目を1列で取得しなきゃいけない状態になったので、調べて解決。
「partition by」なるものを使いました。

ID name group cd
1 a 3 31
2 b 2 22
3 c 2 23
4 d 1 41
5 e 3 35
6 f 5 56
7 g  5 57
8 h 5 58
9 i 2 29
10 j  4 410

こんなデータ(実際はもっとレコード数とかあるけど)があったときに、「group」単位で、○番目の「cd」を取得したい。

例えば、「group」毎に最小の「cd」なら

ID name group cd
4 d 1 41
2 b 2 22
1 a 3 31
10 j 4 410
6 f 5 56
select *
from
  (
    select
      ID
      , name
      , cd
      , row_number() over(partition by group order by cd) row_num
    from
      table
  )
where
  row_num = 1

単純にrownumで行番号に対して○番目というやり方だと、結合条件次第で結果が変わってとても今回の用件は満たさなかったのよね。あとは、

where
  row_num = 1

の条件式を変更してやれば、○番目の取得が出来ますよと。
大きいほうから○番目の取得なら、

      , row_number() over(partition by group order by cd) row_num

のorder by をdescで降順にするなりなんなりと。
さらに、条件を変えたものをコピーしてLEFT JOINで結合しておけば、「group」単位で2個しかなくても、NULLを返してくるだけなので、問題ナッシン!

参考URL:https://ameblo.jp/lovetanpopo/entry-10280370777.html







-ORACLE
-

関連記事

Oracleで複数レコードを更新する方法

UPDATE文で、複数のレコードを一回のトランザクション内で更新する必要に迫られました。 基本的に、今まで使ってきたUPDATE文では、 UPDATE tableA set COL1 = 1 ,COL …

[ORACLE]今接続しているサーバー・スキーマとかを確認する

Oracle使ってる時に、今どのサーバーに繋いでるの?とか、今どのスキーマに繋いでるの? ってなるとき無いですか? そんなときの確認法。 今、どのサーバーに接続してるんだ? 先日の仮想マシンにOrac …

ORACLEでTO_CHARを使用し、カンマ区切りデータを出力する

帳票出力を行うPGで困った。 数値形式のデータのため、カンマ区切りで表示したいんだけど、テンプレートの制約のせいで上手く行かなくて時の解決方法。 帳票のテンプレートとなるファイルのセルは文字列形式。 …

何度だって引っかかるORACLEのエラー・・・。ORA-01008:バインドされていない変数があります。

今日も今日とて、ORA-01008のエラーに悩まされる。 無慈悲に「バインドされていない変数があります。」ってメッセージは出してくれるんだけど、ビンゴの位置は教えてくれないわけで・・・ 何度目だろう・ …

[ORACLE]ORA-24344:正常に終了しましたが、コンパイル・エラーがあります。

全然、正常に終われてねぇんじゃん?? って思った。 ビューの作成時に発生。 ネットで検索するも、明確な回答は見当たらず・・・ ただ、エラーには違いないので、ビューが正しく作成されていないことになる。 …


カテゴリー