본문 바로가기
끄적/DB

[Oracle] OVER() 와 PARTITION BY 사용하기

by 밀키스 2021. 10. 30.

@ OVER 

   => GROUP BY, ORDER BY를 이용한 서브쿼리를 개선하기 위해 나온 함수

 

라고들 한다. 분명히 이 녀석을 사용할 때 특히, group by 없이 집계 함수(sum,count, min....)를 사용하는 것은 굉장히 큰 이점이다.

 

1. group by 사용에 따르는 제한적인 부분이나(뱉는 칼럼 수와 그룹화 시킬 수의 일치라던가...), 2.복잡한 서브쿼리를 자제할 수 있기 때문에 해당 구문을 사용한다.

 

 

 

 

 


 

 

 

@ PARTITION BY 

 

      => OVER() 함수와 사용했을 때, Group By의 역할을 수행하는 녀석

 

GROUP BY 없이 OVER()를 통해 집계 함수를 사용하는건 분명 큰 장점이지만, 대부분 집계 함수는 GROUP BY와 많이 사용하게 된다.

 

때문에, 해당 함수를 통해 특정 칼럼을 묶어주고 내가 필요한 집계 함수를 사용고자할 때, 해당 표현을 사용한다.

 

 

간단한 예시를 들어보자

 

예시 들기 - OVER와 PARTITION BY 

만일 내가 회사 이름, 지역코드, 해당 지역코드의 수  이렇게 3가지를 출력하고 싶다고 할 때

 

SELECT A.DEPARTMENT_NAME, A.LOCATION_ID, B.NUM
FROM DEPARTMENTS A, (SELECT LOCATION_ID, COUNT(LOCATION_ID) NUM 
					FROM DEPARTMENTS GROUP BY LOCATION_ID) B
WHERE A.LOCATION_ID = B.LOCATION_ID

 

이런식으로 작성할 수 있다. 더 효율적인건 모르겠다 대충....

 

이렇게하면 각 회사 이름, 지역 코드, 해당 지역코드가 모두 몇군데인지를 출력할 수 있다.

 

 

이번엔 OVER와 PARTITION BY를 사용해서 같은 결과를 출력해보면

SELECT DEPARTMENT_NAME, LOCATION_ID, COUNT(LOCATION_ID) OVER(PARTITION BY LOCATION_ID) NUM
FROM DEPARTMENTS

 

 

이와 같이 출력할 수 있다.

 

 

조금 간단히 정리를 해보면

 

 

 


윈도우함수(칼럼 이름) OVER(PARTITION BY 혹은 ORDER BY etc... 칼럼이름) 

 

이 구문을 통해 서브쿼리나, 조인, GROUP BY 없이 집계 함수를 사용할 수 있다.

 


 

간단하게 윈도우 함수를 어떻게 사용하는지에 대해 복습했다!!

 

다음에는 ROWS||RANGE와 BETWEEN을 함께 사용해서 윈도우절에 대해 복습해보자!! 

 

일하다 보면 쿼리문이 너무 복잡한 경우가 많은데... 분명 정리를 해놓으면 도움이 될것 같당

반응형

댓글