Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Platí pro: SQL Server 2022 (16.x) a novější verze
databáze SQL Azure SQL Database
Azure SQL Managed Instance
v Microsoft Fabric
Definice pojmenovaného okna v WINDOW klauzuli určuje dělení a řazení sady řádků před funkcí okna, která používá okno v OVER klauzuli.
Klauzule WINDOW vyžaduje úroveň 160 kompatibility databáze nebo vyšší. Pokud je úroveň kompatibility databáze nižší než 160, databázový stroj nemůže s klauzulí spouštět dotazy WINDOW .
Úroveň kompatibility sys.databases můžete zkontrolovat v zobrazení nebo ve vlastnostech databáze. Úroveň kompatibility databáze můžete změnit pomocí následujícího příkazu:
ALTER DATABASE DatabaseName
SET COMPATIBILITY_LEVEL = 160;
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
Název definované specifikace okna Tento název používají funkce okna v OVER klauzuli k odkaz na specifikaci okna. Názvy oken musí dodržovat pravidla pro identifikátory.
reference_window_name
Název okna, na které odkazuje aktuální okno. Odkazované okno musí být mezi okny definovanými v klauzuli WINDOW .
Další argumenty jsou:
PARTITION BY, která rozdělí sadu výsledků dotazu na oddíly.
ORDER BY, která definuje logické pořadí řádků v rámci každého oddílu sady výsledků.
ŘÁDKY/OBLAST , které omezují řádky v oddílu zadáním počátečních a koncových bodů v rámci oddílu.
Podrobnější podrobnosti o argumentech najdete v klauzuli OVER.
Remarks
V klauzuli WINDOW lze definovat více pojmenovaných oken.
Do pojmenovaného okna v OVER klauzuli lze přidat další komponenty pomocí window_name následovaných dodatečnými specifikacemi. Vlastnosti zadané v WINDOW klauzuli však nelze v klauzuli předefinovat OVER .
Pokud dotaz používá více oken, jedno pojmenované okno může odkazovat na jiné pojmenované okno pomocí window_name. V tomto případě musí být odkazovaná window_name zadána v definici okna odkazujícího okna. Komponenta okna definovaná v jednom okně nemůže být znovu definována jiným oknem, na které odkazuje.
Na základě pořadí, ve kterém jsou okna definována v klauzuli okna, jsou povoleny odkazy dopředu a dozadu okna. Jinými slovy, okno může používat jakékoli jiné okno definované ve výrazu okna, jehož součástí je, jako reference_window_name, bez ohledu na pořadí, ve kterém jsou definované. Cyklické odkazy a použití více odkazů na okna v jednom okně nejsou povoleny.
Rozsah nového window_name definovaného okna obsaženého ve výrazu okna se skládá z definic oken, které jsou součástí výrazu okna, společně s SELECT klauzulí specifikace dotazu nebo SELECT příkazu, který obsahuje klauzuli window. Pokud je výraz okna obsažen ve specifikaci dotazu, která je součástí výrazu dotazu, což je základní tabulkový dotaz, pak rozsah nového window_name zahrnuje ORDER BY také výraz ( pokud existuje) tohoto výrazu dotazu.
Omezení použití specifikací oken v OVER klauzuli s agregačními a analytickými funkcemi na základě jejich sémantiky se vztahují na WINDOW klauzuli.
Examples
Ukázky kódu v tomto článku používají ukázkovou databázi AdventureWorks2025 nebo AdventureWorksDW2025, kterou si můžete stáhnout z domovské stránky Microsoft SQL Serveru pro ukázky a komunitní projekty .
A. Zadání okna definovaného v klauzuli window
Následující příklad dotazu ukazuje použití pojmenovaného okna v OVER klauzuli.
ALTER DATABASE AdventureWorks2022
SET COMPATIBILITY_LEVEL = 160;
GO
USE AdventureWorks2022;
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;
GO
Následující dotaz je ekvivalentem předchozího dotazu bez použití WINDOW klauzule.
USE AdventureWorks2022;
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;
GO
Tady je soubor výsledků.
| Číslo řádku | 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. Zadání jednoho okna v několika klauzulích OVER
Následující příklad ukazuje definování specifikace okna a jeho použití vícekrát v OVER klauzuli.
ALTER DATABASE AdventureWorks2022
SET COMPATIBILITY_LEVEL = 160;
GO
USE AdventureWorks2022;
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);
GO
Následující dotaz je ekvivalentem předchozího dotazu bez použití WINDOW klauzule.
USE AdventureWorks2022;
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
Tady je soubor výsledků.
| 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. Definování společné specifikace v klauzuli window
Tento příklad ukazuje definování společné specifikace v okně a jeho použití k definování dalších specifikací v klauzuli OVER .
ALTER DATABASE AdventureWorks2022
SET COMPATIBILITY_LEVEL = 160;
GO
USE AdventureWorks2022;
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
);
GO
Následující dotaz je ekvivalentem předchozího dotazu bez použití WINDOW klauzule.
USE AdventureWorks2022;
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%';
GO
Tady je soubor výsledků.
| 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. Odkazy na dopředu a dozadu
Tento příklad ukazuje použití pojmenovaných oken jako dopředu a dozadu odkazy při definování nového okna v klauzuli WINDOW .
ALTER DATABASE AdventureWorks2022
SET COMPATIBILITY_LEVEL = 160;
GO
USE AdventureWorks2022;
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 (win2 PARTITION BY SalesOrderID);
GO
Následující dotaz je ekvivalentem předchozího dotazu bez použití WINDOW klauzule.
USE AdventureWorks2022;
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%';
GO
Tady je soubor výsledků.
| 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 |
Související obsah
- Agregační funkce (Transact-SQL)
- analytických funkcí (Transact-SQL)
- SELECT - OVER – klauzule (Transact-SQL)
- SELECT (Transact-SQL)
- Klauzule SELECT (Transact-SQL)