테스트 데이터 및 결과 내용은 아래와 같습니다.
간단히 요약하면 pk 컬럼을 기준으로 seq값이 큰순으로 4개의 row를 가져오고
New 컬럼은 위의 4개를 가져온 데이터에서 seq를 오름 차순 정렬한 내용과 같습니다.
아래쿼리처럼 2번의 sort를 하면 구할수 있겠지만 데이터가 워낙많은 테이블이라 한번의 sort나 처리로 구하고 싶습니다.
아무리 생각해도 답이 나오질 않네요...
고수님들의 도움 요청합니다.
select pk, seq,
row_number() over(partition by pk order by seq ) new
from (select row_number() over(partition by pk order by seq desc) rn,
a.*
from ( select 'A' pk, '1' seq from dual union all
select 'A' pk, '2' seq from dual union all
select 'A' pk, '3' seq from dual union all
select 'A' pk, '4' seq from dual union all
select 'A' pk, '5' seq from dual union all
select 'A' pk, '6' seq from dual union all
select 'B' pk, '1' seq from dual union all
select 'B' pk, '2' seq from dual union all
select 'B' pk, '3' seq from dual ) a
) a
where rn <= 4
* 테스트 데이터========================
PK SEQ
A 1
A 2
A 3
A 4
A 5
A 6
B 1
B 2
B 3
* 테스트 데이터 쿼리======================
select *
from ( select 'A' pk, '1' seq from dual union all
select 'A' pk, '2' seq from dual union all
select 'A' pk, '3' seq from dual union all
select 'A' pk, '4' seq from dual union all
select 'A' pk, '5' seq from dual union all
select 'A' pk, '6' seq from dual union all
select 'B' pk, '1' seq from dual union all
select 'B' pk, '2' seq from dual union all
* 결과 데이터 =============================
PK SEQ NEW
A 6 4
A 5 3
A 4 2
A 3 1
B 3 3
B 2 2
B 1 1
|