[Oracle] 윈도우 함수

Oracle / / 2019. 6. 10. 16:52

윈도우 함수

윈도우 함수는 굉장히 중요한 기능입니다. 윈도우 함수는 데이터를 가공하게 해준다는 점에서도 중요하지만, 성능과 큰 관계가 있습니다. 윈도우 함수의 특징을 한마디로 정의하면 '집약 기능이 없는 GROUP BY 구'입니다. GROUP BY 구는 자르기와 집약이라는 두 개의 기능으로 구분됩니다. 윈도우 함수는 여기서 자르기 기능만 있는 것입니다. 윈도우 함수도 테이블을 자르는 것은 GROUP BY와 같습니다. 윈도우 함수는 이를 'PARTITION BY'라는 구로 수행합니다. 차이점이 있다면 자른 후에 집약하지 않으므로 출력 결과의 레코드 수가 입력되는 테이블의 레코드 수와 같다는 것입니다.

 

윈도우 함수의 기본적인 구문은 집약 함수 뒤에 OVER 구를 작성하고, 내부에 자를 키를 지정하는 PARTITION BY 또는 ORDER BY를 입력하는 것입니다. 작성하는 장소는 SELECT 구라고만 생각해도 문제없습니다. 다음은 윈도우 함수로 주소별 사람수를 계산하는 SQL 구문입니다.

SELECT  address
      , COUNT(*) OVER(PARTITON BY address)
FROM    ADDRESS

출력되는 결과는 GROUP BY와 비교하면 레코드의 수가 다릅니다. 윈도우 함수에서는 테이블의 레코드가 기존에 9개였다면, 9개가 출력됩니다.. 이는 집약 작업이 수행되지 않았기 때문입니다. 

 

윈도우 함수로 사용할 수 있는 함수로는 COUNT 또는 SUM과 같은 일반 함수 이외에도, 윈도우 함수 전용 함수로 제공되는 RANK 또는 ROW_NUMBER 등의 순서 함수가 있습니다. 예를 들어 나이가 가장 많은 순서로 순위를 붙인다면 다음 처럼 구문을 작성합니다.

SELECT  name
      , age
      , RANK() OVER(ORDER BY age DESC) AS rnk
FROM    ADDRESS;

만약 동일한 등수가 있다면 3등 다음에 5등이 바로 나올 수 있는데, 이런 건너뛰는 작업이 없이 순위를 구하고 싶다면 'DENSE_RANK' 함수를 사용하면 됩니다.

 

윈도우 함수에는 이 이외에도 RANGE 또는 ROWS 등의 여러 가지 새부 옵션을 지정하는 방법이 있습니다.

'Oracle' 카테고리의 다른 글

[Oracle] 결합알고리즘과 성능  (0) 2019.06.24
[Oracle] 집계와 조건 분기  (0) 2019.06.10
[Oracle] 집합 연산  (0) 2019.06.10
[Oracle] SQL 구문의 성능을 결정하는 실행 계획  (0) 2019.06.10
[Oracle] DBMS와 실행 계획  (0) 2019.06.04
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기