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でORA-01747 : 指定された列が無効ですのエラーの分かりづらさ・・・

OracleでORA-01747 : 指定された列が無効ですのエラーの分かりづらさったらありません・・・ SQLのUPDATE文の実行時に 「ORA-01747 : 指定された列が無効です」 とエラー …

ORACLEでCASE文を使用した時にORA-00932のエラーが出る

割と悩んだ・・・ 原因は、CASE文で使用している項目のデータ型が異なるのが原因みたいだけど、正直、ぴんと来てない現実w select case name when ‘A’ then ‘あ’ when …

[ORACLE]多分、例外的なora-00911:文字が無効ですエラーの解決方法

多分、このエラーを目にする機会はそれなりにあって、大体の対処法はググればすぐに見つかると思う。 例えば、 SQL実行時にはOKなのに、C#のOracleDbAccess実行時にエラーになる 全角スペー …

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

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

[Oracle]破棄されたオブジェクトにアクセスできません。 オブジェクト名 ‘oracleconnection’ です。

破棄されたオブジェクトにアクセスできません。 オブジェクト名 ‘oracleconnection’ です。 破棄されたオブジェクトかどうかの判断(MSDK) MSDNでも破棄さ …


カテゴリー