Udostępnij za pośrednictwem


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

Topic link iconKonwencje składni języka 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 noteImportant 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