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
-

関連記事

SQL文中で全角文字を使うなと言われたので、ORACLEでJOIN句の条件式をCASE文で分岐させる

JOINの条件式にCase文を入れる http://blog.goo.ne.jp/ilikehobby/e/80b471f96f6d693b6c5df75f18591c0e SQL文中で全角文字を使う …

no image

Oracleの再受験無料キャンペーンは5月31日まで

【ピアソンVUE専用】Oracle会場試験用受験チケット(電子チケット) 価格:26,720円 (2019/5/19 14:11時点) 感想(15件) 【ピアソンVUE専用】Oracleオンライン試験 …

[ORACLE]統計更新を強制的にする

Oracleの統計情報の更新方法 頻度はそんなに無いというか、先日、トラブル対応時に必要に迫られたので・・・ 通常は、Oracleの統計情報は1日1回更新されるらしいんだけど、夜とかになるみたい。 多 …

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

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

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

この土日は休日出勤でした・・・ そして、昨日・・・新しい現象が発生しました。 日本の中心付近で仕様変更と闘うSE日記日本の中心付近で仕様変更と闘うSE日記http://ht-jp.net/blog/p …


カテゴリー