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).
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ż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 |