database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 39422 게시물 읽기
No. 39422
최근 데이터를 가져와서 정렬 하는 쿼리 문의
작성자
정용석(libranet)
작성일
2012-04-27 03:25
조회수
4,549

테스트 데이터 및 결과 내용은 아래와 같습니다. 

간단히 요약하면 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

 

이 글에 대한 댓글이 총 2건 있습니다.

with t as (
select 'A' PK,   '1' SEQ from dual
union all select 'A',   '2' from dual
union all select 'A',   '3' from dual
union all select 'A',   '4' from dual
union all select 'A',   '5' from dual
union all select 'A',   '6' from dual
union all select 'B',   '1' from dual
union all select 'B',   '2' from dual
union all select 'B',   '3' from dual
)
select pk, seq, r_cnt - rn + 1 new_rn
  from
      (select pk, seq,
              row_number() over (partition by pk order by seq desc) rn,
              least(count(*) over (partition by pk),4) r_cnt
         from t)
 where rn <= 4

 

손님님이 2012-04-27 08:15에 작성한 댓글입니다. Edit

 감사합니다.

덕분에 잘 해결되었습니다^^

정용석(libranet)님이 2012-04-27 16:56에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
39426sql 쿼리 도움좀( 두가지 조건 만족하는 쿼리) [1]
초보
2012-04-29
4116
39425최소 금액인 코드와 금액 구하기 [1]
1234
2012-04-27
4704
39423sql 쿼리 문의 좀 드립니다. [3]
하동우
2012-04-27
4593
39422최근 데이터를 가져와서 정렬 하는 쿼리 문의 [2]
정용석
2012-04-27
4549
39421두개의 조건을 만족하는 값을 출력하는 sql 부탁드려요 ;; [2]
박철우이
2012-04-26
3992
39420DB 모델링 관련 (부모와 자식 테이블) [1]
양희종
2012-04-26
5355
39419해킹한 사용자정보와 ip를 알고싶은데요 [1]
정원백
2012-04-26
4225
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.024초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다