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
운영게시판
최근게시물
PostgreSQL Q&A 8941 게시물 읽기
No. 8941
rank없이 테이블의 상위 1~5등 어떻게 가져올까요?
작성자
박노성(scns)
작성일
2012-02-06 09:05
조회수
10,229

테이블의 한 정수값을 기준으로 1~5등까지 가져와야 하는데..

문제는 rank()를 쓸 수가 없습니다. 어떻게 해야될까요?

등수에 중복이 있습니다. 1등 만 10명이 나오고 11등으로 바로 넘어갈 수도 있구요.

이럴 경우에는 1등 10명을 다 출력해야 합니다. 2,3,4,5등은 없으므로 Skip하구요.

아직 초보라 잘 모르겠네요.

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

 랭킹에 대한 쿼리 처리는 언제나 비용이 많이 듭니다. 

가장 간단한 방법은 rank() 함수 결과를 inline view로 하고, 

그것에 대한 where 추가로 푸는 것이 일반적입니다. 

(비용이 만만찮죠)

 

select player, score, rank_num from (select player, score,

rank() over (order by score desc) as rank_num from rank_table) as t where rank_num < 11 

order by rank_num, player

edb=# SELECT uname,score, 
rank() OVER (ORDER BY score DESC) as ranks FROM t                                             ;
 uname | score | ranks
-------+-------+-------
 a     |   100 |     1
 b     |   100 |     1
 c     |   100 |     1
 d     |    90 |     4
 e     |    90 |     4
 f     |    80 |     6
 g     |    70 |     7
 h     |    70 |     7
 i     |    60 |     9
 j     |    60 |     9
 k     |    50 |    11
 l     |    40 |    12
 m     |    30 |    13
 n     |    30 |    13
 o     |    30 |    13
 p     |    20 |    16
(16 rows)
edb=# select * from 
(SELECT uname,score, 
rank() OVER (ORDER BY score DESC) as ranks FROM t) as t 
where ranks < 11 order by ranks;
 uname | score | ranks
-------+-------+-------
 a     |   100 |     1
 b     |   100 |     1
 c     |   100 |     1
 d     |    90 |     4
 e     |    90 |     4
 f     |    80 |     6
 g     |    70 |     7
 h     |    70 |     7
 i     |    60 |     9
 j     |    60 |     9
(10 rows)

 

이런식이 되겠죠. 

윗 쿼리의 비용은 테이블의 자료량과 비례합니다. 

그래서, 자료량이 많은 경우는 rank_num 칼럼을 추가하고, 인덱스도 만들어두고, 

그것을 배치성으로 계속 갱신하고, 

자료는 그냥 rank_num 칼럼을 기준으로 작성하는 방법이 있습니다.

 

또 다른 방법은 순위의 기준이 되는 칼럼들을 인덱스로 만들어두고,

 응용프로그램에서 해당 인덱스를 사용하는 쿼리를 실행해서, 

순위값(1위,2위.....)은 DB에서 구하지 않고, 응용 프로그램에서 계산을 하는 방식도 있습니다.

 

이런 저런 방식들이 모두 서로 장단점이 있어서, 

가장 적당한 방법은 업무의 특성에 맞게 선택하셔야할 것 같습니다.

 

순위 구하기,  깔끔한 답이 안 나오는 부분 가운데 하나입니다. 

 

김상기(ioseph)님이 2012-02-07 11:36에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
8948db백업하는 방법 (psql)상에서 [1]
구자은
2012-02-07
9153
8947postgreSQL에서 이미지 파일 다운 가능한가요?? [2]
김종수
2012-02-07
9876
8946psql 상에서의 한글깨짐현상!! [4]
구자은
2012-02-07
13682
8941rank없이 테이블의 상위 1~5등 어떻게 가져올까요? [1]
박노성
2012-02-06
10229
8940어떻게 해야 인덱스를 타는 건가요? [3]
현승
2012-02-05
8994
8935프로그램을 실행했을때 변경된 테이블을 찾고싶습니다. [2]
히말라야새
2012-02-03
9259
8934top 명령어로 본 postgresql 프로세스 질문 [4]
facy
2012-02-02
8710
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.023초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다