일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- gas
- hive
- list
- Redshift
- dataframe
- Java
- Google Excel
- Tkinter
- Apache
- PostgreSQL
- 파이썬
- Excel
- Github
- c#
- matplotlib
- Google Spreadsheet
- string
- django
- PySpark
- PANDAS
- array
- Mac
- Python
- SQL
- math
- numpy
- Kotlin
- GIT
- google apps script
- Today
- Total
달나라 노트
Redshift : RANK, DENSE_RANK, ROW_NUMBER (순위, 컬럼번호 부여하기) 본문
Redshift : RANK, DENSE_RANK, ROW_NUMBER (순위, 컬럼번호 부여하기)
CosmosProject 2020. 12. 17. 02:12
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가 동일하여도 단순히 행의 순서에 따른 행 번호를 매기게 됩니다.
'SQL > Redshift' 카테고리의 다른 글
Redshift : TRIM, LTRIM, RTRIM (문자열의 공백 제거) (0) | 2020.12.17 |
---|---|
Redshift : concat, ||, + (문자열 합치기) (0) | 2020.12.17 |
Redshift : nullif (특정 값일 때 null값을 반환) (0) | 2020.12.17 |
Redshift : nvl, nvl2, coalesce (여러 값 중 null이 아닌 값 추출하기) (0) | 2020.12.17 |
Redshift : replace (텍스트 바꾸기) (0) | 2020.12.17 |