함수명을 쓰고 OVER 쓴다음 범위를 지정해주면 된다
OVER( [PARTITION] [ORDER BY] [ROWS] ) : 이걸로 서브집합을 선택해주는 것
ROW_NUMBER : 맨 왼쪽 인덱스 번호
RANK : 순위인데 중복되면 중복된 것 만큼 순위는 건너 띔
DENSE_RANK : 만약 1등이 두명이 나오면 그다음 3등이 2등이 되는 RANK
NTILE : 백분율로 가장 상위가 1% 로 1 로 나옴 , 가장 하위가 100
파티션의 경우 playerID로 Group by 와 유사하게 할수 있는데 다른 점은 Group by 는 하나로 묶어 버리지만 Partition 의 경우에는 각 행별로 모두 보이게 된다
결과
PlayerID 별로 랭킹이 매겨져 있는 걸 볼 수가 있다
LAG(바로 이전 : 나열된것의 바로 위) ,LEAD(바로 다음 : 나열된 것을 바로 아래)
결과
playerID 기준으로 salary 값 위아래를 보면 prevSalary 와 nextSalary 값이 있다는 것을 알 수 있다
FIRST_VALUE : 가장 처음 값 : 여금 여기선 큰
LAST_VALUE : 가장 마지막 값 : 지금 여기선 작은 값
결과를 보면 WORST 가 제대로된 작은 값이 아닌데
그 이유는 Desc 로 정렬하여 큰 값은 나오게 되는데 나오는 검색 과정이
동일 아이디의 가장 위에서 부터 하나씩 증가 시키면서 그 중에 큰걸 보게 되는 순서라
4500000
4500000 , 2750000
4500000 , 2750000, 500000
이런순을 검색하면서 그 중 가장 큰걸 뽑아오는게 FIRST_VALUE 라서 best 는 제대로 되지만 worst 는 제대로 되지 않는다는걸 알 수 있다
그래서 LAST_VALUE 의 경우에는 제일 처음부터 증가하는 형태인 키워드 (UNBOUNDED PRECEDING) 를 넣어주고 현재 까지의 진행라인에 대한 현재 CURRENT_ROW 까지 는 BEST 라인이 범위가 되도록 ROWS 를 지정해주면 되고
그다음 LAST_VALUE 에대해선 현재 라인 CURRENT_ROW 부터 동일 아이디에 대해서 마지막 라인을 얘기하는 UNBOUNDED FOLLOWING 을 넣어주면제대로된 WORST 값이 나오게 된다
제대로된 결과
오라클에서 OVER 절에 WINDOWING 절을 처음 사용할 때 ROWS와 RANGE가 어떤 차이점이 있는지 많이 헷갈릴 수 있다. 간단히 설명하면 ROWS는 각 행의 위치고, RANGE는 값의 범위라고 생각하면 된다. 아래의 예제를 여러 번 반복해서 보면 많이 어렵지 않게 이해할 수 있을 것이다.
아래의 키워드 의미부터 숙지를 하고 예제를 보면 더욱 이해하기 쉬울 것이다.
키워드 | 설명 |
ROWS | 물리적인 행 단위 |
RANGE | 논리적인 행 집합 |
CURRENT ROW | 현재 행 |
UNBOUNDED PRECEDING | 첫 번째 행 |
UNBOUNDED FOLLOWING | 마지막 행 |
[위치] PRECEDING | [위치] 이전 행 |
[위치] FOLLOWING | [위치] 다음 행 |
'서버(Server) > DB' 카테고리의 다른 글
DB : 복합 인덱스 (0) | 2023.03.02 |
---|---|
DB : INDEX (0) | 2023.03.01 |
Northwind and pubs sample databases for Microsoft SQL Server (0) | 2023.02.23 |
DB : 테이블을 변수에, IF 문, WHILE 문, BREAK , CONTINUE (0) | 2023.02.20 |
DB : BATCH : GO (0) | 2023.02.19 |