달나라 노트

Redshift : RANK, DENSE_RANK, ROW_NUMBER (순위, 컬럼번호 부여하기) 본문

SQL/Redshift

Redshift : RANK, DENSE_RANK, ROW_NUMBER (순위, 컬럼번호 부여하기)

CosmosProject 2020. 12. 17. 02:12
728x90
반응형

 

 

RANK() OVER()

예시 테이블
Table Name : salary_list

id part name salary
1 First_Part One 1000
2 First_Part Two 1900
3 First_Part Three 1400
4 First_Part Four 1700
5 First_Part Five 1400
6 Second_Part Six 1900
7 Second_Part Seven 1200
8 Second_Part Eight 1200
9 Second_Part Nine 1200
10 Second_Part Ten 1300

 

 

 

SELECT  *,
        RANK() OVER(ORDER BY salary DESC) AS rank
FROM salary_list


Result Set

id part name salary rank
2 First_Part Two 1900 1
6 Second_Part Six 1900 1
4 First_Part Four 1700 3
3 First_Part Three 1400 4
5 First_Part Five 1400 4
10 Second_Part Ten 1300 6
7 Second_Part Seven 1200 7
8 Second_Part Eight 1200 7
9 Second_Part Nine 1200 7
1 First_Part One 1000 10

 

RANK()함수를 사용하였으니 RANK()함수의 결과를 나타낼 컬럼이 가장 오른쪽에 추가된 것을 볼 수 있습니다.
OVER(ORDER BY salary DESC)이 부분에 의해서 RANK()함수의 기준이 salary 컬럼을 기준으로 내림차순을 하여 순위를 매기게 됩니다.
salary가 동일하면 동일 등수로 표시되며 그 다음 salary는 동일 등수를 모두 고려한 다음 등수로 표시됩니다.
예를들어 Three와 Five의 salary는 공동 4위이며 그 다음인 Ten의 salary는 5위가 아닌 6위가 됩니다.

 

 

 

 

 

 

 

DENSE_RANK()

 

SELECT  *,
        DENSE_RANK() OVER(ORDER BY salary DESC) AS rank
FROM salary_list


Result Set

id part name salary rank
2 First_Part Two 1900 1
6 Second_Part Six 1900 1
4 First_Part Four 1700 2
3 First_Part Three 1400 3
5 First_Part Five 1400 3
10 Second_Part Ten 1300 4
7 Second_Part Seven 1200 5
8 Second_Part Eight 1200 5
9 Second_Part Nine 1200 5
1 First_Part One 1000 6

 

DENSE_RANK()함수를 사용하였으니 DENSE_RANK()함수의 결과를 나타낼 컬럼이 가장 오른쪽에 추가된 것을 볼 수 있습니다.
OVER(ORDER BY salary DESC)이 부분에 의해서 DENSE_RANK()함수의 기준이 salary 컬럼을 기준으로 내림차순을 하여 순위를 매기게 됩니다.
salary가 동일하면 동일 등수로 표시되지만 DENSE_RANK() 함수가 RANK() 함수와 다른 점은, 그 다음 salary가 동일 등수를 모두 고려한 다음 등수가 아닌 그냥 숫자상으로 다음 등수가 표시된다는 것입니다..
예를들어 Two와 Six의 salary는 공동 1위이며 그 다음인 Four의 salary는 3위가 아닌 2위가 됩니다.

 

 

 

 

 

 

 

ROW_NUMBER()

 

SELECT  *,
        ROW_NUMBER() OVER(ORDER BY salary DESC) AS rank
FROM salary_list

 

 

 

 


Result Set

id part name salary rank
2 First_Part Two 1900 1
6 Second_Part Six 1900 2
4 First_Part Four 1700 3
3 First_Part Three 1400 4
5 First_Part Five 1400 5
10 Second_Part Ten 1300 6
7 Second_Part Seven 1200 7
8 Second_Part Eight 1200 8
9 Second_Part Nine 1200 9
1 First_Part One 1000 10

 

ROW_NUMBER()함수를 사용하였으니 ROW_NUMBER()함수의 결과를 나타낼 컬럼이 가장 오른쪽에 추가된 것을 볼 수 있습니다.
OVER(ORDER BY salary DESC)이 부분에 의해서 ROW_NUMBER()함수의 기준이 salary 컬럼을 기준으로 내림차순을 하여 순위를 매기게 됩니다.
ROW_NUMBER() 함수의 특징은 말 그대로 행 번호를 매긴다는 것입니다.
이 말은 동일한 salary 값이어도 ROW_NUMBER()함수로 인한 값은 다르다는 것입니다.
예를들어 Two와 Six의 salary는 동일하지만 Two가 더 위쪽에 있으므로 Two가 1, Six가 2의 값을 가지게 됩니다.

 

 

 

 

 

 

 

 

RANK() OVER(PARTITION BY ~ ORDER BY ~)

 

SELECT  *,
        RANK() OVER(PARTITION BY part ORDER BY salary DESC) AS rank
FROM salary_list

 

Result Set

id part name salary rank
2 First_Part Two 1900 1
4 First_Part Four 1700 2
3 First_Part Three 1400 3
5 First_Part Five 1400 3
1 First_Part One 1000 5
6 Second_Part Six 1900 1
10 Second_Part Ten 1300 2
7 Second_Part Seven 1200 3
8 Second_Part Eight 1200 3
9 Second_Part Nine 1200 3

 

RANK() 함수의 OVER 부분에 [PARTITION BY part] 라는 부분이 추가되었습니다.
위 결과를 보면 일반 RANK() 함수처럼 [ORDER BY salary DESC] 에 의해 salary가 높은 순서대로 순위를 매기지만 순위 비교의 대상이 [PARTITION BY]에 명시된 part가 됩니다.
위 데이터에는 총 2종류의 part가 있으며 순위 비교가 각 part 내에서 이뤄지게 됩니다.

 

 

 

 

 

 

 

 

 

DENSE_RANK() OVER(PARTITION BY ~ ORDER BY ~)

 

SELECT  *,
        DENSE_RANK() OVER(PARTITION BY part ORDER BY salary DESC) AS rank
FROM salary_list

 

Result Set

id part name salary rank
2 First_Part Two 1900 1
4 First_Part Four 1700 2
3 First_Part Three 1400 3
5 First_Part Five 1400 3
1 First_Part One 1000 4
6 Second_Part Six 1900 1
10 Second_Part Ten 1300 2
7 Second_Part Seven 1200 3
8 Second_Part Eight 1200 3
9 Second_Part Nine 1200 3

 

DENSE_RANK() 함수의 OVER 부분에 [PARTITION BY part] 라는 부분이 추가되었습니다.
위 결과를 보면 일반 DENSE_RANK() 함수처럼 [ORDER BY salary DESC] 에 의해 salary가 높은 순서대로 순위를 매기지만 순위 비교의 대상이 [PARTITION BY]에 명시된 part가 됩니다.
위 데이터에는 총 2종류의 part가 있으며 순위 비교가 각 part 내에서 이뤄지게 됩니다.
또한 DENSE_RANK() 함수의 특징처럼 동일 등수가 발생한 다음 등수는 단순히 +1을 한 등수가 됩니다.

 

 

 

 

 

 

 

 

ROW_NUMBER() OVER(PARTITION BY ~ ORDER BY ~)

 

SELECT  *,
        ROW_NUMBER() OVER(PARTITION BY part ORDER BY salary DESC) AS rank
FROM salary_list

 

Result Set

id part name salary rank
2 First_Part Two 1900 1
4 First_Part Four 1700 2
3 First_Part Three 1400 3
5 First_Part Five 1400 4
1 First_Part One 1000 5
6 Second_Part Six 1900 1
10 Second_Part Ten 1300 2
7 Second_Part Seven 1200 3
8 Second_Part Eight 1200 4
9 Second_Part Nine 1200 5

 

ROW_NUMBER() 함수의 OVER 부분에 [PARTITION BY part] 라는 부분이 추가되었습니다.
위 결과를 보면 일반 ROW_NUMBER() 함수처럼 [ORDER BY salary DESC] 에 의해 salary가 높은 순서대로 순위를 매기지만 순위 비교의 대상이 [PARTITION BY]에 명시된 part가 됩니다.
위 데이터에는 총 2종류의 part가 있으며 순위 비교가 각 part 내에서 이뤄지게 됩니다.
또한 ROW_NUMBER() 함수의 특징처럼 salary가 동일하여도 단순히 행의 순서에 따른 행 번호를 매기게 됩니다.

 

 

 

728x90
반응형
Comments