Megosztás a következőn keresztül:


SELECT – WINDOW záradék (Transact-SQL)

A következőkre vonatkozik: Az SQL Server 2022 (16.x) és újabb verziói az Azure SQL DatabaseAzure SQL Managed InstanceSQL-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