Aracılığıyla paylaş


SELECT - WINDOW yan tümcesi (Transact-SQL)

Şunlar için geçerlidir: SQL Server 2022 (16.x) ve sonraki sürümleri Microsoft Fabric'teAzure SQL VeritabanıAzure SQL Yönetilen Örneği SQL veritabanı

Yan tümcesindeki WINDOW adlandırılmış pencere tanımı, bir yan tümcedeki pencereyi OVER kullanan window işlevinden önce bir satır kümesinin bölümlemesi ve sırasını belirler.

WINDOW yan tümcesi, veritabanı uyumluluk düzeyi veya daha yüksek bir düzey 160 gerektirir. Veritabanı uyumluluk düzeyiniz değerinden 160düşükse, Veritabanı Altyapısı yan tümcesiyle WINDOW sorgu yürütemez.

Uyumluluk düzeyini görünümde sys.databases veya veritabanı özelliklerinde de kontrol edebilirsiniz. Aşağıdaki komutla veritabanının uyumluluk düzeyini değiştirebilirsiniz:

ALTER DATABASE DatabaseName
SET COMPATIBILITY_LEVEL = 160;

Transact-SQL söz dizimi kuralları

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

Tanımlı pencere belirtiminin adı. Bu ad, yan tümcesindeki OVER pencere işlevleri tarafından pencere belirtimine başvurmak için kullanılır. Pencere adları, tanımlayıcılar için kurallara uymalıdır.

reference_window_name

Geçerli pencere tarafından başvurulmakta olan pencerenin adı. Başvuruda bulunılan pencere yan tümcesinde WINDOW tanımlanan pencereler arasında olmalıdır.

Diğer bağımsız değişkenler şunlardır:

Bağımsız değişkenler hakkında daha ayrıntılı bilgi için OVER yan tümcesine bakın

Remarks

Yan tümcesinde WINDOW birden fazla adlandırılmış pencere tanımlanabilir.

window_name OVER belirtimler kullanılarak yan tümcesindeki adlandırılmış bir pencereye daha fazla bileşen eklenebilir. Ancak yan tümcesinde WINDOW belirtilen özellikler yan tümcesinde OVER yeniden tanımlanamaz.

Sorgu birden çok pencere kullandığında, adlandırılmış bir pencere window_name kullanarak başka bir adlandırılmış pencereye başvurabilir. Bu durumda, başvuruda bulunan window_name başvuran pencerenin pencere tanımında belirtilmelidir. Bir pencerede tanımlanan pencere bileşeni, başvuruda bulunan başka bir pencere tarafından yeniden tanımlanamaz.

Pencere yan tümcesinde pencerelerin tanımlanma sırasına bağlı olarak, ileri ve geri pencere başvurularına izin verilir. Başka bir deyişle, bir pencere, tanımlandıkları sıradan bağımsız olarak reference_window_name olarak, pencere ifadesinde tanımlanan başka bir pencereyi kullanabilir. Tek bir pencerede döngüsel başvurulara ve birden çok pencere başvurusu kullanılmasına izin verilmez.

Bir pencere ifadesinde yer alan tanımlı bir pencerenin yeni window_name kapsamı, pencere yan tümcesini içeren sorgu belirtiminin veya SELECT deyiminin yan tümcesiyle SELECT birlikte pencere ifadesinin parçası olan tüm pencere tanımlarından oluşur. Pencere ifadesi, temel bir tablo sorgusu olan sorgu ifadesinin parçası olan bir sorgu belirtiminde yer alıyorsa, yeni window_name kapsamı varsa, bu sorgu ifadesinin ifadesini de içerir ORDER BY .

Yan tümcesindeki OVER pencere belirtimlerinin semantiğine göre toplama ve analiz işlevleriyle kullanımına yönelik kısıtlamalar yan tümce için WINDOW geçerlidir.

Examples

Bu makaledeki kod örnekleri, AdventureWorks2025 giriş sayfasından indirebileceğiniz AdventureWorksDW2025 veya örnek veritabanını kullanır.

A. window yan tümcesinde tanımlanan bir pencere belirtin

Aşağıdaki örnek sorgu, yan tümcesinde OVER adlandırılmış bir pencere kullandığını gösterir.

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

Aşağıdaki sorgu, yan tümcesini kullanmadan önceki sorgunun eşdeğeridir WINDOW .

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

Sonuç kümesi aşağıdadır.

Satır Numarası 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. Birden çok OVER yan tümcesinde tek bir pencere belirtme

Aşağıdaki örnekte bir pencere belirtimi tanımlama ve bunu yan OVER tümcede birden çok kez kullanma gösterilmektedir.

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

Aşağıdaki sorgu, yan tümcesini kullanmadan önceki sorgunun eşdeğeridir WINDOW .

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

Sonuç kümesi aşağıdadır.

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. Pencere yan tümcesinde ortak belirtim tanımlama

Bu örnek, bir pencerede ortak belirtim tanımlamayı ve yan tümcesinde OVER ek belirtimleri tanımlamak için kullanmayı gösterir.

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

Aşağıdaki sorgu, yan tümcesini kullanmadan önceki sorgunun eşdeğeridir WINDOW .

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

Sonuç kümesi aşağıdadır.

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. İleri ve geri pencere başvuruları

Bu örnek, yan tümcesinde WINDOW yeni bir pencere tanımlarken ileri ve geri başvurular olarak adlandırılmış pencerelerin kullanılmasını gösterir.

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

Aşağıdaki sorgu, yan tümcesini kullanmadan önceki sorgunun eşdeğeridir WINDOW .

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

Sonuç kümesi aşağıdadır.

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