W klauzula (języka Transact-SQL)
Określa partycjonowanie i kolejność zestawu zestaw wierszy przed zastosowaniem funkcja skojarzonego okna.
Stosuje się do:
Klasyfikacja funkcje okna
Funkcje agregujące okna.Aby uzyskać więcej informacji zobaczAggregate Functions (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 ] ] )
Argumenty
PARTYCJA PRZEZ
Dzieli zestaw w partycjach wyników.Funkcja okno zostanie zastosowany do każdej partycji oddzielnie i obliczeń zostanie ponownie uruchomiony dla każdej partycji.value_expression
Specifies the column by which the rowset produced by the corresponding FROM clause is partitioned.value_expression can only refer to columns made available by the FROM clause.value_expression cannot refer to expressions or aliases in the select list.value_expression can be a column expression, scalar subquery, scalar function, or user-defined variable.<Klauzula ORDER BY>
Określa kolejność, aby zastosować klasyfikację funkcja okna.Aby uzyskać więcej informacji zobaczORDER BY Clause (Transact-SQL).Important Note: W kontekście klasyfikacji funkcja okna <Klauzula ORDER BY> można odwoływać się wyłącznie do kolumn udostępnione przez klauzuli FROM. Nie można określić liczbę całkowitą z zakresu do reprezentowania położenie nazwy ani alias kolumna na liście select.<Klauzula ORDER BY> Nie można użyć funkcji agregacja okna.
Remarks
Window functions are defined in the ISO SQL standard.SQL Server provides ranking and aggregate window functions.Okno jest określone przez użytkownika zbiór wierszy.Funkcja okno oblicza wartość dla każdego wiersza zestaw wyników uzyskanych z okna.
Więcej niż jeden klasyfikacji lub funkcja agregacja okna mogą być używane w jednej kwerendzie jednym FROM.Jednak klauzula sieci dla każdej funkcja może różnić się w partycjonowanie, a także kolejności.Klauzula sieci nie może być używany z tej suma kontrolna funkcja agregująca.
Przykłady
A.Używanie klauzula przez funkcja ROW_NUMBER
Każda funkcja klasyfikacji ROW_NUMBER, DENSE_RANK, pozycja, NTILE używa klauzula sieci.W poniższym przykładzie pokazano, za pomocą OVER Klauzula z 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
B.Klauzula sieci przy użyciu funkcji agregacja
Poniższe przykłady pokazują, za pomocą OVER Klauzula z funkcji agregacja. W tym przykładzie za pomocą OVER Klauzula jest bardziej efektywne niż przy użyciu podkwerendy.
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
Here is the result set.
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 pokazano, za pomocą OVER Klauzula z funkcją agregującą w obliczoną wartość.
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
Here is the result set. Należy zauważyć, że zagregowanych są obliczane przez SalesOrderID oraz Percent by ProductID dla każdego wiersza jest obliczany 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 |