#title Windowing Functiion의 이해 [[TableOfContents]] ==== SQL Server 2005에서 추가된 Windowing Function ==== SQL Server 2005에서 새롭게 선보인 함수 중 주목할 만한 함수가 있다. 바로 Ranking 함수(ROW_NUMBER()등의 함수는 도움말 참조)이다. 우선 예제를 보자. {{{ USE AdventureWorks GO SELECT i.ProductID , p.Name , i.LocationID , i.Quantity , RANK() OVER (PARTITION BY i.LocationID ORDER BY i.Quantity) AS RANK FROM Production.ProductInventory i JOIN Production.Product p ON i.ProductID = p.ProductID ORDER BY p.Name GO }}} attachment:WindowingFunctiion의이해/windowing_function01.jpg 실행계획을 보면 ‘시퀀스 프로젝트’ 라는 것이 보일 것이다. 그림에서 설명된 것처럼 ‘정렬된 집합에 대해 계산을 수행하기 위해 열을 추가합니다.’ 라고 나와 있다. 여기서 말하는 정렬된 집합이 바로 ‘Window’다. 함수는 Window를 어떻게 정의하느냐에 따라서 결과집합을 다르게 반환한다. 정리하자면 다음과 같다. 1. RANK()함수는 Window내의 컬럼에 대해 순위를 매겨주는 함수이다. 2. Window는 OVER() 안쪽에 정의한다. 3. OVER() 안쪽의 PARTITION BY는 그룹화할 집합을 정의하는 것이다. 4. ORDER BY는 그룹화된 집합을 어떤 기준으로 정렬을 할지 결정한다. 즉, 아래 문장의 의미는 {{{ RANK() OVER (PARTITION BY i.LocationID ORDER BYi.Quantity) AS RANK }}} attachment:WindowingFunctiion의이해/windowing_function02.jpg 의 의미가 된다. 즉, 윈도우 별로 순위를 매겨보겠다는 뜻이다. SQL Server 2005는 RANK, NTILE, DENSE_RANK, ROW_NUMBER 와 같이 4개의 Windowing Function을 제공한다. 도움말에서는 ‘순위 함수’ 라는 말로 정보를 제공하고 있다. 이전 버전에서는 전체의 순위를 얻기는 쉽지만 다양한 그룹별 순위를 얻기가 쉽지만은 않았다. SQL도 복잡하고, 성능도 제대로 나오지 않았다. 이제 2005 버전의 순위 함수를 이용하면 쉽고, 빠르게 결과를 볼 수 있다. 필자는 더 많은 Windowing Function이 나오리라 기대를 했었지만 떨렁 4개를 제공하여, 적지 않은 실망을 하였다. 하지만 그래도 이게 어디인가? 없는 것 보다는 훨씬 낫다. SQL이 훨씬 쉬워진다. ==== 2012 이상 버전은 ==== 2012 이상 버전은 [SQL Server Analysis Function]를 참고. ==== Oracle Server의 Windowing Function ==== Oracle Server의 경우는 [분석용 함수의 이용] 문서를 참고하면 된다. 이는 Oracle8i(8.1.6)이상에서 동작하는 함수다. 이 함수들을 이용하면 SQL이 너무나도 쉬워진다. 만약 어떤 사람이 Oracle에서 SQL문을 작성하는 것이 다른 DBMS보다 어렵다고 한다면 그 사람은 거짓말쟁이거나 허풍쟁이다.