RANK(), DENSE_RANK(), ROW_NUMBER()
각각 순위/순서를 반환하는 함수이지만 결과는 조금씩 다르다.
RANK는 동점자의 있는 경우 동일 순번을 리턴, 다음 순위는 다음 숫자를 하나를 건너뛴다. (1, 2, 2, 4, 4, 6, .. )
DENSE_RANK는 동점자의 경우에 동일한 순번을 리턴, 다음 순위는 다음 숫자부터 진행이 된다 (1, 2, 2, 3, 3, 4, .. )
ROW_NUMBER의 경우 동점자가 있는 경우에 정렬이 된 순서대로 순서를 반환한다. (1, 2, 3, 4, 5, 6, 7, ...)
아래와 같은 데이터가 있다고 가정해보자.
고객
|
판매금액
|
1
|
24000
|
2
|
17000
|
3
|
17000
|
4
|
14000
|
5
|
13500
|
6
|
13500
|
7
|
13000
|
SELECT 고객,
RANK() OVER (ORDER BY 판매금액 DESC) RANK_EX,
DENSE_RANK() OVER (ORDER BY 판매금액 DESC) DENSE_RANK_EX,
ROW_NUMBER() OVER (ORDER BY 판매금액 DESC) ROW_NUMBER_EX
FROM DUAL
쿼리의 결과는 아래와 같다
고객
|
판매금액
|
RANK_EX
|
DENSE_RANK_EX
|
ROW_NUMBER_EX
|
1
|
24000
|
1
|
1
|
1
|
2
|
17000
|
2
|
2
|
2
|
3
|
17000
|
2
|
2
|
3
|
4
|
14000
|
4
|
3
|
4
|
5
|
13500
|
5
|
4
|
5
|
6
|
13500
|
5
|
4
|
6
|
7
|
13000
|
7
|
5
|
7
|
순위를 산정할때에 RANK 또는 DENSE_RANK를 사용하면 유용하다. 그러나 업무중에서 가장 많이 사용했던 함수는 ROW_NUMBER 함수이다.
'PK값(기준값)의 시리얼 데이터 중 가장 최신인 데이터를 가져오고 싶다' 등의 경우 사용하기에 가장 좋은 문법이다.
아래와 같은 데이터가 있다고 가정하자.
고객
|
시리얼번호
|
판매금액
|
1
|
1
|
24000
|
1
|
2
|
17000
|
1
|
3
|
17000
|
2
|
1
|
14000
|
2
|
2
|
13500
|
2
|
3
|
13500
|
2
|
4
|
13000
|
SELECT *
FROM (
SELECT 고객, 시리얼번호, 판매금액,
ROW_NUMBER() OVER(PARTITION BY 고객 ORDER BY 시리얼번호 DESC) SEQ
FROM DUAL
)
WHERE SEQ=1
결과값은 아래와 같다.
고객
|
시리얼번호
|
판매금액
|
SEQ
|
1
|
3
|
17000
|
1
|
2
|
4
|
13000
|
1
|
위 쿼리를 통해 기준값(고객)의 시리얼 데이터(순서를 매기고 싶은 값) 중 가장 마지막 데이터(처음이든 마지막이든..) 를 가져올 수 있다.
'Computer > Database' 카테고리의 다른 글
[EXCEL] 데이터를 연결해주는 VLOOKUP 함수 기초 (0) | 2021.12.01 |
---|---|
[SQL] SUBSTR / INSTR / CONCAT / TRIM / LPAD&RPAD / REPLACE (한 눈에 보는 문자열 함수 모음집) (0) | 2021.11.20 |
[SQL] ROLLUP/GROUPING 깔끔한 소계/합계 보고서만들기 (0) | 2021.11.19 |
[SQL] 서브쿼리 (0) | 2021.11.18 |
[SQL] MERGE문, INSERT와 UPDATE를 동시에 진행하기 (0) | 2021.11.10 |