Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A következőkre vonatkozik: Az SQL Server 2022 (16.x) és újabb verziói
az Azure SQL Database
Azure SQL Managed Instance
SQL-adatbázist a Microsoft Fabricben
A záradékban szereplő WINDOW elnevezett ablakdefiníció határozza meg egy sorhalmaz particionálását és sorrendjét az ablakfüggvény előtt, amely egy OVER záradék ablakát használja.
A WINDOW záradék adatbázis-kompatibilitási szintet vagy magasabb szintet 160 igényel. Ha az adatbázis kompatibilitási szintje alacsonyabb, mint 160az adatbázismotor, az adatbázismotor nem tud lekérdezéseket végrehajtani a WINDOW záradékkal.
A kompatibilitási szintet a nézetben vagy az sys.databases adatbázis tulajdonságaiban ellenőrizheti. Az adatbázis kompatibilitási szintjét az alábbi paranccsal módosíthatja:
ALTER DATABASE DatabaseName
SET COMPATIBILITY_LEVEL = 160;
Transact-SQL szintaxis konvenciók
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
A megadott ablak specifikációjának neve. A záradék ablakfüggvényei OVER ezt a nevet használják az ablak specifikációjának hivatkozásához. Az ablakneveknek az azonosítókra vonatkozó szabályokat kell követnie.
reference_window_name
Az aktuális ablak által hivatkozott ablak neve. A hivatkozott ablaknak a záradékban WINDOW meghatározott ablakok között kell lennie.
A többi argumentum a következő:
PARTITION BY, amely partíciókra osztja a lekérdezés eredményhalmazát.
ORDER BY, amely meghatározza az eredményhalmaz egyes partícióiban lévő sorok logikai sorrendjét.
SOROK/TARTOMÁNY , amelyek a partíción belüli sorokat korlátozzák a partíció kezdő és végpontjainak megadásával.
Az argumentumokkal kapcsolatos további részletekért lásd az OVER záradékot
Remarks
A záradékban több elnevezett ablak is definiálható WINDOW .
A záradék nevesített ablakához további összetevők is hozzáadhatók a OVERwindow_name és a további specifikációk használatával. A záradékban WINDOW megadott tulajdonságok azonban nem definiálhatók újra a OVER záradékban.
Ha egy lekérdezés több ablakot használ, az egyik elnevezett ablak hivatkozhat egy másik elnevezett ablakra a window_name használatával. Ebben az esetben a hivatkozott window_name meg kell adni a hivatkozási ablak ablakdefiníciójában. Az egyik ablakban definiált ablakösszetevőt nem definiálhatja újra egy másik, rá hivatkozó ablak.
Az ablakoknak az ablak záradékban meghatározott sorrendje alapján az előre- és hátrafelé mutató ablakhivatkozások engedélyezettek. Más szóval az ablak az ablakkifejezésben definiált bármely más ablakot használhat, amely reference_window_name része, függetlenül attól, hogy milyen sorrendben vannak definiálva. A ciklikus hivatkozások és több ablakhivatkozás használata egyetlen ablakban nem engedélyezett.
Egy ablakkifejezésben található definiált ablak új window_name hatóköre az ablakkifejezés részét képező ablakdefiníciókból és az SELECT ablak záradékot tartalmazó lekérdezési specifikáció vagy SELECT utasítás záradékából áll. Ha az ablakkifejezés egy lekérdezési kifejezés részét képező lekérdezési specifikációban található, amely egy alapszintű tábla-lekérdezés, akkor az új window_name hatóköre az adott lekérdezési kifejezés kifejezését is tartalmazza ORDER BY , ha van ilyen.
A záradékban OVER az összesítő és analitikus függvények szemantikán alapuló ablakspecifikációinak használatára vonatkozó korlátozások érvényesek a záradékra WINDOW .
Examples
A cikkben szereplő kódminták a AdventureWorks2025 vagy AdventureWorksDW2025 mintaadatbázist használják, amelyet a Microsoft SQL Server-minták és közösségi projektek kezdőlapjáról tölthet le.
A. Az ablak záradékában definiált ablak megadása
Az alábbi példa lekérdezés egy elnevezett ablakot mutat be a OVER záradékban.
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
Az alábbi lekérdezés egyenértékű az előző lekérdezéssel a WINDOW záradék használata nélkül.
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
Itt van az eredmények összessége.
| Sorszám | 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. Egyetlen ablak megadása több OVER záradékban
Az alábbi példa egy ablakspecifikáció definiálása és többszöri használata egy OVER záradékban.
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
Az alábbi lekérdezés egyenértékű az előző lekérdezéssel a WINDOW záradék használata nélkül.
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
Itt van az eredmények összessége.
| 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. Gyakori specifikáció definiálása az ablak záradékában
Ez a példa azt mutatja be, hogy meghatároz egy közös specifikációt egy ablakban, és a záradék további OVER specifikációinak meghatározására használja.
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
Az alábbi lekérdezés egyenértékű az előző lekérdezéssel a WINDOW záradék használata nélkül.
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
Itt van az eredmények összessége.
| 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. Előre- és hátrafelé mutató ablakhivatkozások
Ez a példa azt mutatja be, hogy az elnevezett ablakok használata előre- és hátrafelé mutató hivatkozásként, amikor új ablakot határoz meg a WINDOW záradékban.
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
Az alábbi lekérdezés egyenértékű az előző lekérdezéssel a WINDOW záradék használata nélkül.
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
Itt van az eredmények összessége.
| 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 |