Klauzula OVER (Transact-SQL)

Określa partycjonowanie i kolejność zestaw wierszy przed zastosowaniem odpowiedniego okna funkcja .

Stosuje się do:

Klasyfikacja funkcji okna

Okno funkcji agregacji.Aby uzyskać więcej informacji, zobacz Funkcje agregujące (Transact-SQL).

Ikona łącza do tematuJęzyka Transact-SQL składni konwencje

Składnia

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 ] ] )

Argumenty

  • PARTYCJĘ
    Dzieli zestaw wyników na partycje.Okno funkcja jest stosowane do każdej partycji oddzielnie i ponownym uruchomieniu obliczeń dla każdej partycji.

  • value_expression
    Określa kolumna za pomocą której jest podzielony na partycje zestaw wierszy wytworzony przez odpowiednie klauzula .value_expressionmoże odnosić się tylko do kolumn udostępnione przez klauzulaFROM.value_expressionnie można odwołać się do wyrażenia lub aliasy liście select.value_expressionmoże byćwyrażenie kolumna, wartość skalarnapodzapytanie, wartość skalarnafunkcjalub zmiennej zdefiniowanej przez użytkownika.

  • <Klauzula ORDER BY>
    Określa kolejność Aby zastosować klasyfikację okno funkcja.Aby uzyskać więcej informacji, zobacz Klauzula ORDER BY (Transact-SQL).

    Ważna informacjaWażne:

    W kontekście uszeregowania okno funkcja <klauzula ORDER przez> tylko mogą odwoływać się do kolumn, udostępnione przez klauzulaFROM.Nie można określić całkowitą reprezentująca pozycję nazwy lub alias kolumna na liście select.<Klauzula ORDER przez> nie można korzystać z funkcji wartość zagregowana okna.

Uwagi

Funkcje okna są zdefiniowane w ISO SQL standardowych.SQL Serverzawiera klasyfikację i wartość zagregowana funkcje okna.Okno jest określona przez użytkownika zestaw wierszy.Okno funkcja oblicza wartość dla każdego wiersza w zestaw wyników pochodzące z okna.

Więcej niż jeden klasyfikacji lub wartość zagregowana okno funkcja może być użyta w pojedynczą kwerendę za pomocą jednego z klauzula.Jednakże, mogą się różnić w klauzula dla każdej funkcja w podziału na partycjonowanie i również zamawiania.OVER klauzula nie można używać zfunkcja wartość zagregowanasumy kontrolnej.

Przykłady

A.OVER klauzula przy użyciu funkcjaNumer_wiersza

Każdy Klasyfikacja funkcja, Numer_wiersza, DENSE_RANK, pozycja, NTILE używa OVER klauzula.W poniższym przykładzie za pomocą OVER klauzula z ROW_NUMBER.

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

B.Przy użyciu funkcji wartość zagregowana OVER klauzula

Następujące przykłady przedstawiają za pomocą OVER klauzula z funkcji wartość zagregowana .W tym przykładzie za pomocą OVER klauzula jest bardziej wydajny niż przy użyciu podkwerendy.

USE AdventureWorks2008R2;
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

Oto zestaw wyników.

SalesOrderID

IDProduktu

OrderQty

Suma

Avg

Count

Min

Max

43659

776

1

26

2

12

1

6

43659

777

3

26

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

W poniższym przykładzie za pomocą OVERklauzula zfunkcja wartość zagregowanaw obliczoną wartość.

USE AdventureWorks2008R2;
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

Oto zestaw wyników.Należy zauważyć, że zagregowane dane są obliczane przez SalesOrderID i Percent by ProductID jest obliczana dla każdego wiersza SalesOrderID.

SalesOrderID

IDProduktu

OrderQty

Suma

Procent przez IDProduktu

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

Zobacz także

Odwołanie