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 7304 게시물 읽기
No. 7304
RANK 쿼리문을 만들어 봤습니다.
작성자
tyro
작성일
2008-01-11 22:46ⓒ
2008-01-11 22:51ⓜ
조회수
6,315


RANK 쿼리를 만들어 봤습니다.
 
 

함수로 만들어진 쿼리는 찾아보니 이미 오래전에 있더군요..
http://database.sarang.net/?inc=read&aid=5007&criteria=pgsql&subcrit=qna&id=5059&limit=20&keyword=&page=82
 

쿼리문을 보셔서 아시겠지만, 방식은
grp 별로 필요한 순위컬럼을 sort 하여 PK 를 배열로 만들고
필요한 순위만큼 집어내어 실제 테이블과 PK 조인하는 방식입니다.
 

이 방식도 그렇고.. 아래의 쿼리 방식도 그렇고..
실무에서 얼마나 효율을 낼지 궁금해서
실력 분들의 조언을 구하고저 이렇게 올립니다.
 


seq 컬럼은 반드시 존재해야 하며 unique 해야 합니다.
 

아래의 쿼리는 grp 별로 cnt 가 높은 순위 입니다.
 

create aggregate agg_addrow (
  sfunc = array_append,
  basetype = anyelement,
  stype = anyarray,
  initcond = '{}'
);
 

select * from tab;
 seq | grp | other | cnt
-----+-----+-------+-----
   1 |   1 |    44 |   1
   2 |   1 |     3 |   1
   3 |   1 |     5 |   4
   4 |   1 |     7 |   2
   5 |   2 |     2 |   1
   6 |   2 |     8 |   4
   7 |   2 |    15 |   2
   8 |   2 |     9 |   3
   9 |   3 |     1 |   3
  10 |   3 |     6 |   2
(10 rows)
 

select tab .*, rank from tab,
  (select _arr[1:4], rank
   from (
    select agg_addrow(seq) as _arr
    from (
      select grp, seq from tab order by cnt desc
    ) _t
    group by grp
   ) _t cross join generate_series(1,4) rank
   where rank <= 4
  ) _t
where tab.seq = any(_t._arr)
  and rank = idx(_t._arr, tab.seq)
order by grp, rank;
 

 seq | grp | other | cnt | rank
-----+-----+-------+-----+------
   3 |   1 |     5 |   4 |    1
   4 |   1 |     7 |   2 |    2
   2 |   1 |     3 |   1 |    3
   1 |   1 |    44 |   1 |    4
   6 |   2 |     8 |   4 |    1
   8 |   2 |     9 |   3 |    2
   7 |   2 |    15 |   2 |    3
   5 |   2 |     2 |   1 |    4
   9 |   3 |     1 |   3 |    1
  10 |   3 |     6 |   2 |    2
(10 rows)

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

깜찍한 발상이네요. ^^ 집계함수를 이용해서 칼럼추가하기. 

조금만 더 범용적일 수는 없을까? 
고민을 하다가 랭킹 문제는 아무리 보아도 실세계 안에서는 
집계를 통한 랭킹 테이블이 필요악이다는 결론으로 
고민하기를 멈춥니다. 

김상기(ioseph)님이 2008-01-13 00:24에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
7307사용자 생성중 [2]
초짜군
2008-01-16
6413
7306./configure 시 문제가 생깁니다.(다시) [2]
도움좀
2008-01-15
6262
7305클라이언트가 접속이 끊어졌는지 실시간으로 감시는 어떻게? [1]
심상호
2008-01-14
5810
7304RANK 쿼리문을 만들어 봤습니다. [1]
tyro
2008-01-11
6315
7303view 에서 rule적용 질문 (update, insert, delete) [8]
전홍준
2008-01-11
6625
7302postgresql 초기 설치 방법 [1]
권태영
2008-01-09
10520
7301postGIS 관련 질문요~ㅜ.ㅜ [1]
기초인
2008-01-09
6692
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.037초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다