月亮

[SQL] 순위 : RANK() , DENSE_RANK() , ROW_NUMBER() , NTILE() 본문

SQL

[SQL] 순위 : RANK() , DENSE_RANK() , ROW_NUMBER() , NTILE()

듀네 2023. 6. 21. 13:45

SQL에서 순위 함수는 데이터를 정렬하고 해당 데이터의 순위를 계산하는 데 사용된다.

네 가지 일반적인 순위 함수인 RANK, DENSE_RANK 및 ROW_NUMBER 및 NTILE가 있다.

 

1. RANK: 
RANK 함수는 정렬된 데이터에서 각 레코드의 순위를 계산합니다.

동일한 값을 가진 항목에 대해서는 같은 순위를 부여하고, 그 다음 순위는 중복된 항목 수 만큼 건너뛰어 부여합니다.

예를 들어, 1, 2, 2, 3, 4라는 값이 있을 때 RANK 함수를 사용하면 1, 2, 2, 3, 4의 순위는 각각 1, 2, 2, 4, 5가 됩니다.

즉, 순위를 부여하면 중복된 항목이 있을 경우 순위가 건너뛰게 됩니다.

 

2. DENSE_RANK:
DENSE_RANK 함수는 RANK 함수와 유사하지만 중복된 항목이 있을 경우 순위를 건너뛰지 않고 순차적으로 순위를 부여합니다.

따라서 DENSE_RANK 함수를 사용하면 동일한 값에 대해 중복 순위가 부여됩니다.

예를 들어, 1, 2, 2, 3, 4라는 값이 있을 때 DENSE_RANK 함수를 사용하면 1, 2, 2, 3, 4의 순위는 각각 1, 2, 2, 3, 4가 됩니다.

중복된 값에 대해서도 중복되지 않는 순차적인 순위를 부여합니다.

 

3. ROW_NUMBER:
ROW_NUMBER 함수는 정렬되지 않은 데이터 집합에서 각 레코드의 고유한 번호를 부여합니다.

정렬된 데이터를 기반으로 순위를 계산하는 RANK 및 DENSE_RANK와 달리 ROW_NUMBER는 순서가 지정되지 않은 데이터에서 사용됩니다. 따라서 ROW_NUMBER 함수를 사용하면 순위가 아니라 데이터의 원래 순서에 따라 번호가 매겨집니다. ROW_NUMBER 함수는 일반적으로 순위 계산이 필요하지 않은 경우에 사용됩니다.

 

4. NTILE:

NTILE 함수는 결과 집합을 지정된 개수의 동일한 크기로 분할하고, 각 그룹에 번호를 할당하는 윈도우 함수입니다. NTILE 함수는 일반적으로 백분위수를 계산하거나 결과를 여러 그룹으로 분할할 때 사용됩니다.

예) NTILE(3), NTILE(4)...

 

요약하자면,
- RANK 함수: 중복된 항목에 대해 순위를 건너뛰고 순위를 부여합니다.
- DENSE_RANK 함수: 중복된 항목에 대해 중복 순위를 부여합니다.
- ROW_NUMBER 함수: 정렬되지 않은 데이터 집합에서 각 레코드에 고유한 번호를 부여합니다.
- NTILE 함수: 결과 집합을 지정된 개수의 동일한 크기로 분할하고, 각 그룹에 번호를 할당합니다. 이를 통해 백분위수 계산이나 결과를 여러 그룹으로 분할하는데 사용됩니다.

 

예제

CREATE TABLE scores (
                        num   int      NOT NULL,
                        name  varchar(50),
                        score int
					);
insert into scores (num,name, score) VALUE (1,'John',85);
insert into scores (num,name, score) VALUE (2,'Alice',90);
insert into scores (num, name, score) VALUE (3,'Bob',80);
insert into scores (num, name, score) VALUE (4,'Mary',90);
insert into scores (num, name, score) VALUE (5,'Tom',75);
select	num,
		name,
        score, 
		RANK() over (order by score desc) as RANK,
        DENSE_RANK() over (order by score desc) as DENSE_RANK,
        ROW_NUMBER() over (order by num) as ROW_NUMBER,
        NTILE(3) OVER (ORDER BY score DESC) AS ntile_group 
        from scores order by num;

(ROW_NUMBER는 num 기준)

 

 

 

출처:

https://im-first-rate.tistory.com/36

https://learn.microsoft.com/ko-kr/sql/t-sql/functions/ntile-transact-sql?view=sql-server-ver16 

반응형

'SQL' 카테고리의 다른 글

[mysql] 원격으로 mysql dump하고 import하기  (0) 2023.07.26
Comments