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 8397 게시물 읽기
No. 8397
select 질문
작성자
초보
작성일
2009-09-02 15:18
조회수
7,100

안녕하세요~

select 문에 대해서 질문이 있어서 글을 남깁니다.


한 개의 테이블에 그룹, 시간, 데이터 이렇게 3개가 들어가는데 각 그룹별로 데이터가 많은 상위 x개를 검색 할 수 있을까요?


예를 들어서 각 그룹별로 데이터량이 많은 5개를 아래와 같이 select로 검색할 수 있는지 궁금합니다.


그럼 수고하세요~



group |       time   |   data               

1       | 1251855766 | 500000 

1       | 1251855826 | 400000  

1       | 1251855886 | 300000  

1       | 1251855946 | 200000  

1       | 1251856006 | 100000  

2       | 1251855766 | 500000  

2       | 1251855826 | 400000  

2       | 1251855886 | 300000  

2       | 1251855946 | 200000  

2       | 1251856006 | 100000  

3       | 1251855766 | 500000  

3       | 1251855826 | 400000  

3       | 1251855886 | 300000  

3       | 1251855946 | 200000  

3       | 1251856006 | 100000  

4       | 1251855766 | 500000  

4       | 1251855826 | 400000  

4       | 1251855886 | 300000  

4       | 1251855946 | 200000  

4       | 1251856006 | 100000  

5       | 1251855766 | 500000  

5       | 1251855826 | 400000  

5       | 1251855886 | 300000  

5       | 1251855946 | 200000  

5       | 1251856006 | 100000 

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

데이터가 많은 상위 x개를 찾을 때

데이터가 많다는 것은 뭘 기준으로 하는 건가요?

건수를 count한 것인지, 아니면 값을 더한 것인지...

 

group과 time별로 group by 한 데이터 건수가 많은 것을 뜻한다면

다음과 같은 식으로 할 수 있을 듯 합니다.

8.4에 추가된 Window Function을 사용했습니다.

 

select *

from (

select grp, tm, cnt, row_number() over (partition by grp order by cnt desc) as r

from (

select grp, tm, count(*) as cnt

from t

group by grp, tm

) a

) a

where r <= 5;

xxx님이 2009-09-02 19:08에 작성한 댓글입니다. Edit

제가 질문을 이상하게 했네요.. ;;
CREATE TABLE TEST(group int, time int, data int);
TEST 라는 테이블이 이렇게 만들어 지고
data에는 int 값이 들어갑니다.

group   |    time    | data
  1         20090902     100
  1         20090902     200
  1         20090902     300
  1         20090902     400
  1         20090902     500
  1         20090902     600
  1         20090902     700
  1         20090902     800
  1         20090902     900
  2         20090902     100
  2         20090902     200
  2         20090902     300
  2         20090902     400
  2         20090902     500
  2         20090902     600
  2         20090902     700
  2         20090902     800
  2         20090902     900

TEST 테이블에 이렇게 값이 들어가 있다고 가정할때
아래와 같이 각 그룹에서 data가 큰 상위 3개만을 검색하고 싶습니다.

group   |    time    | data
  1         20090902     900
  1         20090902     800
  1         20090902     700
  2         20090902     900
  2         20090902     800
  2         20090902     700

초보님이 2009-09-02 19:45에 작성한 댓글입니다.
이 댓글은 2009-09-02 20:53에 마지막으로 수정되었습니다. Edit

CREATE TABLE TEST(grp int, time int, data int);

insert into test values ( 1 , 20090902 , 100);

insert into test values ( 1 , 20090902 , 200);

insert into test values ( 1 , 20090902 , 300);

insert into test values ( 1 , 20090902 , 400);

insert into test values ( 1 , 20090902 , 500);

insert into test values ( 1 , 20090902 , 600);

insert into test values ( 1 , 20090902 , 700);

insert into test values ( 1 , 20090902 , 800);

insert into test values ( 1 , 20090902 , 900);

insert into test values ( 2 , 20090902 , 100);

insert into test values ( 2 , 20090902 , 200);

insert into test values ( 2 , 20090902 , 300);

insert into test values ( 2 , 20090902 , 400);

insert into test values ( 2 , 20090902 , 500);

insert into test values ( 2 , 20090902 , 600);

insert into test values ( 2 , 20090902 , 700);

insert into test values ( 2 , 20090902 , 800);

insert into test values ( 2 , 20090902 , 900);


select grp, time, data

from (select grp, time, data, row_number() over (partition by grp order by data desc) r from test) a

where r <= 3;

 

time 상관없이 grp로 data가 큰 상위 3개만 검색합니다.

 

이런 종류의 쿼리는 window function을 사용하면 간단히 해결할 수 있지만,

그렇지 않을 경우에는 매우 복잡해질 수도 있습니다.

 

xxx님이 2009-09-03 11:08에 작성한 댓글입니다. Edit

해결됐습니다.

xxx님 정말 감사합니다~~

초보님이 2009-09-03 11:24에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
8439select 다시 질문.. ㅠ.ㅠ
초보
2009-09-04
6331
8438[Greenplum] 테이블 Drop 과 View 관련.. [1]
강가딘
2009-09-04
6669
8413[Greenplum]테이블 생성일자 [1]
강가딘
2009-09-03
7155
8397select 질문 [4]
초보
2009-09-02
7100
8396insert속도 [1]
오만권
2009-09-01
7212
8395timestamp 사용 [3]
김대청
2009-08-31
9342
8394노트북 윈도우에서 PostgreSQL이 설치가 안되네요 [1]
김이수
2009-08-31
6938
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.023초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다