グループ単位で一番小さいとか、一番大きいとかだけなら、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