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でLISTAGG関数を使ったけど、世界を変えられなかった話・・・

OracleでLISTAGG関数を使ったら、世界が変わった話。 はい、休日出勤でした。 そして、休日出勤の結果、以下のことが分かりました(泣 日本の中心付近で仕様変更と闘うSE日記OracleでLIS …

OracleDataaccessでどハマリして、勉強になったとかじゃなくお客さんに迷惑かけたし、もう穴を掘って埋まりたい

みんなは、どうやってOracleDataaccessを筆頭に、複数バージョンが入り乱れるDLLを管理してるのか教えてください。 マジで。

no image

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

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

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

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

ORACLEで他のスキーマでSQLを実行した時に、権限不足で「ORA-01031: 権限が不足しています。」のエラーになる

A5Mk2 http://www.wind.sannet.ne.jp/m_matsu/developer/a5m2/ 普段、SQL関連は、A5Mk2っていうソフトを使用しています。 今回のエラーは、自 …


カテゴリー