본문 바로가기
IT/PostgreSQL

[PostgreSQL] - 포스트그레 순위 함수 RANK(), DENSE_RANK() 함수 사용 방법

by 차이나는 개발자 2023. 1. 6.
728x90
반응형

#포스트그레 순위 함수 RANK(), DENSE_RANK() 함수 사용 방법

-SQL에서 순위 함수 RANK(), DENSE_RANK() 함수들을 사용해서 데이터 들의 순서를 매길수 있습니다.

 

 

#예시 테이블 데이터

-DDL

CREATE TABLE public."member" (
	"name" varchar(20) NULL,
	age numeric(10) NULL,
	phone_number numeric(20) NULL,
	address varchar(30) NULL,
	"deleteYn" bool NULL
);

 

-INSERT DATA

INSERT INTO public."member"
("name", age, phone_number, address, "deleteYn")
VALUES('홍길동2', 20, 1012345678, '부산', true);
INSERT INTO public."member"
("name", age, phone_number, address, "deleteYn")
VALUES('홍길동3', 30, 1012345678, '대구', false);
INSERT INTO public."member"
("name", age, phone_number, address, "deleteYn")
VALUES('홍길동4', 40, 1012345678, '대전', true);
INSERT INTO public."member"
("name", age, phone_number, address, "deleteYn")
VALUES('홍길동5', 50, 1012345678, '광주', true);
INSERT INTO public."member"
("name", age, phone_number, address, "deleteYn")
VALUES('홍길동1', 10, 1012345678, '서울', true);
INSERT INTO public."member"
("name", age, phone_number, address, "deleteYn")
VALUES('홍길동6', 60, 1012345678, '부산', true);
INSERT INTO public."member"
("name", age, phone_number, address, "deleteYn")
VALUES('홍길동7', 70, 1012345678, '대구', false);
INSERT INTO public."member"
("name", age, phone_number, address, "deleteYn")
VALUES('홍길동8', 80, 1012345678, '대전', true);
INSERT INTO public."member"
("name", age, phone_number, address, "deleteYn")
VALUES('홍길동9', 90, 1012345678, '광주', true);
INSERT INTO public."member"
("name", age, phone_number, address, "deleteYn")
VALUES('홍길동10', 100, 1012345678, '서울', true);
INSERT INTO public."member"
("name", age, phone_number, address, "deleteYn")
VALUES('홍길동11', 100, 1012345678, '서울', true);
INSERT INTO public."member"
("name", age, phone_number, address, "deleteYn")
VALUES('홍길동12', 100, 1012345678, '서울', true);
INSERT INTO public."member"
("name", age, phone_number, address, "deleteYn")
VALUES('홍길동13', 110, 1012345678, '서울', true);
INSERT INTO public."member"
("name", age, phone_number, address, "deleteYn")
VALUES('홍길동14', 120, 1012345678, '서울', true);

 

-SELECT DATA

 

 

#RANK() OVER(PARTITION BY ~ ORDER BY ~ ) 함수

-중복된 데이터들을 중복된 데이터만큼 동일 순위로 표시하고 다음 데이터는 중복데이터 숫자를 포함하고나서 매겨진 순위가 지정됩니다.

-address (주소) 를 그룹화하고 age (나이) 를 내림차순으로 순위를 매기는 쿼리입니다.

select *, rank() over(partition by address order by age desc) from member;

 

#결과

-빨간박스를 보시면 서울에 사는 사람들이 나이가 많은 순으로 rank가 매겨진 것을 볼 수 있습니다.

-나이가 같은 경우 동일한 순위를 나타내며 그다음 데이터는 중복데이터를 포함해서 순위가 매겨지게 됩니다.

(1,2,3,3,3,6)

 

 

#DENSE_RANK() OVER(PARTITION BY ~ ORDER BY ~ ) 함수

-중복된 데이터들을 중복된 데이터만큼 동일 순위로 표시하고 다음 데이터는 중복데이터 순위를 포함하지 않고 순위가 지정됩니다.

-address (주소) 를 그룹화하고 age (나이) 를 내림차순으로 순위를 매기는 쿼리입니다.

select *, dense_rank() over(partition by address order by age desc) from member;

 

#결과

-빨간박스를 보시면 서울에 사는 사람들이 나이가 많은 순으로 rank가 매겨진 것을 볼 수 있습니다.

-나이가 같은 경우 동일한 순위를 나타내며 그다음 데이터는 중복데이터를 포함하지 않고 순위가 매겨지게 됩니다.

(1,2,3,3,3,4)

 

 

 

728x90
반응형

댓글