반응형

함수명을 쓰고 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  [위치] 다음 행

 

 

REF : https://gent.tistory.com/473

반응형

'서버(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

+ Recent posts