OVER 절(Transact-SQL)

관련 창 함수를 적용하기 전에 행 집합의 분할과 순서를 결정합니다.

적용 대상

순위 창 함수

집계 창 함수. 자세한 내용은 집계 함수(Transact-SQL)를 참조하십시오.

항목 링크 아이콘Transact-SQL 구문 표기 규칙

구문

Ranking Window Functions 
< OVER_CLAUSE > :: =
    OVER ( [ PARTITION BY value_expression , ... [ n ] ]
           <ORDER BY_Clause> )

Aggregate Window Functions 
< OVER_CLAUSE > :: = 
    OVER ( [ PARTITION BY value_expression , ... [ n ] ] )

인수

  • PARTITION BY
    결과 집합을 파티션으로 분할합니다. 창 함수는 각 파티션에 별도로 적용되므로 각 파티션에 대해 계산이 다시 시작됩니다.

  • value_expression
    해당 FROM 절에서 생성되는 행 집합을 분할하는 데 사용하는 열을 지정합니다. value_expression은 FROM 절을 통해 사용 가능해진 열만 참조할 수 있습니다. value_expression은 SELECT 목록에 있는 식 또는 별칭을 참조할 수 없습니다. value_expression은 열 식, 스칼라 하위 쿼리, 스칼라 함수 또는 사용자 정의 변수일 수 있습니다.

  • <ORDER BY 절>
    순위 창 함수를 적용할 순서를 지정합니다. 자세한 내용은 ORDER BY 절(Transact-SQL)를 참조하십시오.

    중요 정보중요

    순위 창 함수의 컨텍스트에서 사용할 경우 <ORDER BY 절>은 FROM 절에서 사용할 수 있게 만든 열만 참조할 수 있습니다. SELECT 목록에 있는 열의 이름이나 별칭의 위치를 나타내는 데 정수를 지정할 수 없습니다. <ORDER BY 절>은 집계 창 함수와 함께 사용할 수 없습니다.

주의

창 함수는 ISO SQL 표준에 정의되어 있습니다. SQL Server에서는 순위 및 집계 창 함수를 제공합니다. 창은 사용자 지정 행 집합입니다. 창 함수는 창에서 파생된 결과 집합에 있는 각 행의 값을 계산합니다.

한 쿼리의 한 FROM 절 안에서 순위 또는 집계 창 함수를 둘 이상 사용할 수 있습니다. 그러나 각 함수의 OVER 절은 분할 및 순서에서 달라질 수 있습니다. OVER 절은 CHECKSUM 집계 함수와 함께 사용할 수 없습니다.

1. OVER 절에 ROW_NUMBER 함수 사용

각 순위 함수인 ROW_NUMBER, DENSE_RANK, RANK, NTILE는 OVER 절을 사용합니다. 다음 예에서는 OVER 절에 ROW_NUMBER를 사용하는 방법을 보여 줍니다.

USE AdventureWorks;
GO
SELECT c.FirstName, c.LastName
    ,ROW_NUMBER() OVER(ORDER BY SalesYTD DESC) AS 'Row Number'
    ,s.SalesYTD, a.PostalCode
FROM Sales.SalesPerson s 
    INNER JOIN Person.Contact c 
        ON s.SalesPersonID = c.ContactID
    INNER JOIN Person.Address a 
        ON a.AddressID = c.ContactID
WHERE TerritoryID IS NOT NULL 
    AND SalesYTD <> 0;
GO

2. OVER 절에 집계 함수 사용

다음 예에서는 OVER 절에 집계 함수를 사용하는 방법을 보여 줍니다. 이 예에서는 OVER 절을 사용하는 것이 하위 쿼리를 사용하는 것보다 더 효율적입니다.

USE AdventureWorks;
GO
SELECT SalesOrderID, ProductID, OrderQty
    ,SUM(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Total'
    ,AVG(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Avg'
    ,COUNT(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Count'
    ,MIN(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Min'
    ,MAX(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Max'
FROM Sales.SalesOrderDetail 
WHERE SalesOrderID IN(43659,43664);
GO

결과 집합은 다음과 같습니다.

SalesOrderID

ProductID

OrderQty

Total

Avg

Count

Min

Max

43659

776

1

26

2

12

1

6

43659

777

3

6a6c5e-f3ca-4c1e-b64b-0d8ef6986af8.xml.rtf

2

12

1

6

43659

778

1

26

2

12

1

6

43659

771

1

26

2

12

1

6

43659

772

1

26

2

12

1

6

43659

773

2

26

2

12

1

6

43659

774

1

26

2

12

1

6

43659

714

3

26

2

12

1

6

43659

716

1

26

2

12

1

6

43659

709

6

26

2

12

1

6

43659

712

2

26

2

12

1

6

43659

711

4

26

2

12

1

6

43664

772

1

14

1

8

1

4

43664

775

4

14

1

8

1

4

43664

714

1

14

1

8

1

4

43664

716

1

14

1

8

1

4

43664

777

2

14

1

8

1

4

43664

771

3

14

1

8

1

4

43664

773

1

14

1

8

1

4

43664

778

1

14

1

8

1

4

다음 예에서는 OVER 절에 계산된 값의 집계 함수를 사용하는 방법을 보여 줍니다.

USE AdventureWorks;
GO
SELECT SalesOrderID, ProductID, OrderQty
    ,SUM(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Total'
    ,CAST(1. * OrderQty / SUM(OrderQty) OVER(PARTITION BY SalesOrderID) 
        *100 AS DECIMAL(5,2))AS 'Percent by ProductID'
FROM Sales.SalesOrderDetail 
WHERE SalesOrderID IN(43659,43664);
GO

결과 집합은 다음과 같습니다. 집계는 SalesOrderID로 계산되며 각 SalesOrderID의 각 줄에 대해 Percent by ProductID가 계산됩니다.

SalesOrderID

ProductID

OrderQty

Total

Percent by ProductID

43659

776

1

26

3.85

43659

777

3

26

11.54

43659

778

1

26

3.85

43659

771

1

26

3.85

43659

772

1

26

3.85

43659

773

2

26

7.69

43659

774

1

26

3.85

43659

714

3

26

11.54

43659

716

1

26

3.85

43659

709

6

26

23.08

43659

712

2

26

7.69

43659

711

4

26

15.38

43664

772

1

14

7.14

43664

775

4

14

28.57

43664

714

1

14

7.14

43664

716

1

14

7.14

43664

777

2

14

14.29

43664

771

3

14

21.43

43664

773

1

14

7.14

43664

778

1

14

7.14

참고 항목

참조