Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy: SQL Server 2022 (16.x) i nowsze wersje bazy danych
SQL Sql Azure SQL
Database w
usłudze Microsoft Fabric
Nazwana definicja okna w WINDOW klauzuli określa partycjonowanie i kolejność zestawu wierszy przed funkcją okna, która używa okna w klauzuli OVER .
Klauzula WINDOW wymaga poziomu 160 zgodności bazy danych lub wyższego. Jeśli poziom zgodności bazy danych jest niższy niż 160, aparat bazy danych nie może wykonywać zapytań za pomocą klauzuli WINDOW .
Poziom zgodności można sprawdzić w sys.databases widoku lub we właściwościach bazy danych. Poziom zgodności bazy danych można zmienić za pomocą następującego polecenia:
ALTER DATABASE DatabaseName
SET COMPATIBILITY_LEVEL = 160;
Transact-SQL konwencje składni
Syntax
WINDOW window_name AS (
[ reference_window_name ]
[ <PARTITION BY clause> ]
[ <ORDER BY clause> ]
[ <ROW or RANGE clause> ]
)
<PARTITION BY clause> ::=
PARTITION BY value_expression , ... [ n ]
<ORDER BY clause> ::=
ORDER BY order_by_expression
[ COLLATE collation_name ]
[ ASC | DESC ]
[ , ...n ]
<ROW or RANGE clause> ::=
{ ROWS | RANGE } <window frame extent>
Arguments
window_name
Nazwa zdefiniowanej specyfikacji okna. Ta nazwa jest używana przez funkcje okna w klauzuli OVER , aby odwoływać się do specyfikacji okna. Nazwy okien muszą być zgodne z regułami dotyczącymi identyfikatorów.
reference_window_name
Nazwa okna, do których odwołuje się bieżące okno. Okno, do których odwołuje się odwołanie, musi znajdować się w oknach zdefiniowanych w klauzuli WINDOW .
Inne argumenty to:
PARTITION BY dzielący zestaw wyników zapytania na partycje.
ORDER BY definiujące logiczną kolejność wierszy w każdej partycji zestawu wyników.
WIERSZE/ZAKRES , które ograniczają wiersze w partycji przez określenie punktów początkowych i końcowych w partycji.
Aby uzyskać bardziej szczegółowe informacje na temat argumentów, zobacz KLAUZULA SELECT — OVER.
Remarks
W klauzuli WINDOW można zdefiniować więcej niż jedno nazwane okno.
Więcej składników można dodać do nazwanego okna w OVER klauzuli przy użyciu window_name i dodatkowych specyfikacji. Jednak właściwości określone w WINDOW klauzuli nie można ponownie zdefiniować w klauzuli OVER .
Jeśli zapytanie używa wielu okien, jedno nazwane okno może odwoływać się do innego nazwanego okna przy użyciu window_name. W tym przypadku przywołyną window_name należy określić w definicji okna odwołującego się okna. Składnik okna zdefiniowany w jednym oknie nie może zostać ponownie zdefiniowany przez inne okno odwołujące się do niego.
Na podstawie kolejności, w jakiej okna są zdefiniowane w klauzuli okna, odwołania do okna do przodu i do tyłu są dozwolone. Innymi słowy, okno może używać dowolnego innego okna zdefiniowanego w wyrażeniu okna, którego częścią jest reference_window_name, niezależnie od kolejności, w jakiej są zdefiniowane. Odwołania cykliczne i używanie wielu odwołań do okien w jednym oknie nie jest dozwolone.
Zakres nowego window_name zdefiniowanego okna zawartego w wyrażeniu okna składa się z dowolnych definicji okien, które są częścią wyrażenia okna, wraz z SELECT klauzulą specyfikacji zapytania lub SELECT instrukcji zawierającej klauzulę okna. Jeśli wyrażenie okna jest zawarte w specyfikacji zapytania, która jest częścią wyrażenia zapytania, które jest podstawowym zapytaniem tabeli, zakres nowego window_name zawiera ORDER BY również wyrażenie, jeśli istnieje, tego wyrażenia zapytania.
Ograniczenia dotyczące użycia specyfikacji okien w OVER klauzuli z funkcjami agregowanymi i analitycznymi na podstawie ich semantyki mają zastosowanie do WINDOW klauzuli .
Examples
Przykłady kodu w tym artykule korzystają z przykładowej bazy danych AdventureWorks2025 lub AdventureWorksDW2025, którą można pobrać ze strony głównej Przykładów programu Microsoft SQL Server i projektów społeczności.
A. Określanie okna zdefiniowanego w klauzuli window
Poniższe przykładowe zapytanie przedstawia użycie nazwanego okna w klauzuli OVER .
ALTER DATABASE AdventureWorks2025
SET COMPATIBILITY_LEVEL = 160;
GO
USE AdventureWorks2025;
GO
SELECT ROW_NUMBER() OVER win AS [Row Number],
p.LastName,
s.SalesYTD,
a.PostalCode
FROM Sales.SalesPerson AS s
INNER JOIN Person.Person AS p
ON s.BusinessEntityID = p.BusinessEntityID
INNER JOIN Person.Address AS a
ON a.AddressID = p.BusinessEntityID
WHERE TerritoryID IS NOT NULL
AND SalesYTD <> 0
WINDOW win AS (
PARTITION BY PostalCode ORDER BY SalesYTD DESC
)
ORDER BY PostalCode;
Poniższe zapytanie jest odpowiednikiem poprzedniego zapytania bez używania klauzuli WINDOW .
USE AdventureWorks2025;
GO
SELECT ROW_NUMBER() OVER (
PARTITION BY PostalCode ORDER BY SalesYTD DESC
) AS [Row Number],
p.LastName,
s.SalesYTD,
a.PostalCode
FROM Sales.SalesPerson AS s
INNER JOIN Person.Person AS p
ON s.BusinessEntityID = p.BusinessEntityID
INNER JOIN Person.Address AS a
ON a.AddressID = p.BusinessEntityID
WHERE TerritoryID IS NOT NULL
AND SalesYTD <> 0
ORDER BY PostalCode;
Oto zestaw wyników.
| Numer wiersza | LastName | SalesYTD | PostalCode |
|---|---|---|---|
| 1 | Mitchell | 4251368.5497 | 98027 |
| 2 | Blythe | 3763178.1787 | 98027 |
| 3 | Carson | 3189418.3662 | 98027 |
| 4 | Reiter | 2315185.611 | 98027 |
| 5 | Vargas | 1453719.4653 | 98027 |
| 6 | Ansman-Wolfe | 1352577.1325 | 98027 |
| 1 | Pak | 4116871.2277 | 98055 |
| 2 | Varkey Chudukatil | 3121616.3202 | 98055 |
| 3 | Saraiva | 2604540.7172 | 98055 |
| 4 | Ito | 2458535.6169 | 98055 |
| 5 | Valdez | 1827066.7118 | 98055 |
| 6 | Mensa-Annan | 1576562.1966 | 98055 |
| 7 | Campbell | 1573012.9383 | 98055 |
| 8 | Tsoflias | 1421810.9242 | 98055 |
B. Określanie pojedynczego okna w wielu klauzulach OVER
W poniższym przykładzie przedstawiono definiowanie specyfikacji okna i wielokrotne używanie jej w klauzuli OVER .
ALTER DATABASE AdventureWorks2025
SET COMPATIBILITY_LEVEL = 160;
GO
USE AdventureWorks2025;
GO
SELECT SalesOrderID,
ProductID,
OrderQty,
SUM(OrderQty) OVER win AS [Total],
AVG(OrderQty) OVER win AS [Avg],
COUNT(OrderQty) OVER win AS [Count],
MIN(OrderQty) OVER win AS [Min],
MAX(OrderQty) OVER win AS [Max]
FROM Sales.SalesOrderDetail
WHERE SalesOrderID IN (43659, 43664)
WINDOW win AS (PARTITION BY SalesOrderID);
Poniższe zapytanie jest odpowiednikiem poprzedniego zapytania bez używania klauzuli WINDOW .
USE AdventureWorks2025;
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);
Oto zestaw wyników.
| SalesOrderID | ProductID | OrderQty | Total | 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 |
C. Definiowanie wspólnej specyfikacji w klauzuli window
W tym przykładzie pokazano definiowanie wspólnej specyfikacji w oknie i używanie jej do definiowania dodatkowych specyfikacji w klauzuli OVER .
ALTER DATABASE AdventureWorks2025
SET COMPATIBILITY_LEVEL = 160;
GO
USE AdventureWorks2025;
GO
SELECT SalesOrderID AS OrderNumber,
ProductID,
OrderQty AS Qty,
SUM(OrderQty) OVER win AS Total,
AVG(OrderQty) OVER (
win PARTITION BY SalesOrderID
) AS Avg,
COUNT(OrderQty) OVER (
win ROWS BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING
) AS Count
FROM Sales.SalesOrderDetail
WHERE SalesOrderID IN (43659, 43664)
AND ProductID LIKE '71%'
WINDOW win AS (
ORDER BY SalesOrderID, ProductID
);
Poniższe zapytanie jest odpowiednikiem poprzedniego zapytania bez używania klauzuli WINDOW .
USE AdventureWorks2025;
GO
SELECT SalesOrderID AS OrderNumber,
ProductID,
OrderQty AS Qty,
SUM(OrderQty) OVER (
ORDER BY SalesOrderID, ProductID
) AS Total,
AVG(OrderQty) OVER (
PARTITION BY SalesOrderID ORDER BY SalesOrderID, ProductID
) AS Avg,
COUNT(OrderQty) OVER (
ORDER BY SalesOrderID, ProductID ROWS BETWEEN UNBOUNDED PRECEDING AND 1 FOLLOWING
) AS Count
FROM Sales.SalesOrderDetail
WHERE SalesOrderID IN (43659, 43664)
AND ProductID LIKE '71%';
Oto zestaw wyników.
| OrderNumber | ProductID | Qty | Total | Avg | Count |
|---|---|---|---|---|---|
| 43659 | 711 | 4 | 4 | 4 | 2 |
| 43659 | 712 | 2 | 6 | 3 | 3 |
| 43659 | 714 | 3 | 9 | 3 | 4 |
| 43659 | 716 | 1 | 10 | 2 | 5 |
| 43664 | 714 | 1 | 11 | 1 | 6 |
| 43664 | 716 | 1 | 12 | 1 | 6 |
D. Odwołania do okna do przodu i do tyłu
W tym przykładzie pokazano używanie nazwanych okien jako odwołań do przodu i wstecz podczas definiowania nowego okna w klauzuli WINDOW .
ALTER DATABASE AdventureWorks2025
SET COMPATIBILITY_LEVEL = 160;
GO
USE AdventureWorks2025;
GO
SELECT SalesOrderID AS OrderNumber,
ProductID,
OrderQty AS Qty,
SUM(OrderQty) OVER win2 AS Total,
AVG(OrderQty) OVER win1 AS Avg
FROM Sales.SalesOrderDetail
WHERE SalesOrderID IN (43659, 43664)
AND ProductID LIKE '71%'
WINDOW win1 AS (win3),
win2 AS (ORDER BY SalesOrderID, ProductID),
win3 AS (win2PARTITION BY SalesOrderID);
Poniższe zapytanie jest odpowiednikiem poprzedniego zapytania bez używania klauzuli WINDOW .
USE AdventureWorks2025;
GO
SELECT SalesOrderID AS OrderNumber,
ProductID,
OrderQty AS Qty,
SUM(OrderQty) OVER (
ORDER BY SalesOrderID, ProductID
) AS Total,
AVG(OrderQty) OVER (
PARTITION BY SalesOrderID ORDER BY SalesOrderID, ProductID
) AS Avg
FROM Sales.SalesOrderDetail
WHERE SalesOrderID IN (43659, 43664)
AND ProductID LIKE '71%';
Oto zestaw wyników.
| OrderNumber | ProductID | Qty | Total | Avg |
|---|---|---|---|---|
| 43659 | 711 | 4 | 4 | 4 |
| 43659 | 712 | 2 | 6 | 3 |
| 43659 | 714 | 3 | 9 | 3 |
| 43659 | 716 | 1 | 10 | 2 |
| 43664 | 714 | 1 | 11 | 1 |
| 43664 | 716 | 1 | 12 | 1 |
Treści powiązane
- funkcje agregujące (Transact-SQL)
- funkcje analityczne (Transact-SQL)
- SELECT — klauzula OVER (Transact-SQL)
- WYBIERZ (Transact-SQL)
- KLAUZULA SELECT (Transact-SQL)