Определение именованного окна с предложением SELECT WINDOW
- 6 мин
В SQL Server 2022 представлено предложение WINDOW
в инструкциях SELECT
, что упрощает выполнение сложных функций окна и вычислений данных.
ВЫБРАТЬ - ОКНО
Предложение WINDOW
позволяет определить именованную спецификацию окна, которая может использоваться с несколькими функциями окна в запросе. Эта функция упрощает сложные вычисления, такие как скользящее среднее значение и итоги выполнения, позволяя повторно использовать определение одного окна.
Упрощение агрегирования и вычислений с помощью предложения WINDOWS
Представьте, что вы разработчик базы данных, работающий над приложением электронной коммерции. У вас есть таблица SalesOrderHeader, содержащая столбцы SalesOrderID и OrderDate. У вас есть вторая таблица с именем SalesOrderDetail, содержащая столбцы SalesOrderID, ProductID, OrderQty, UnitPrice и LineTotal. Отдел продаж попросил вас проанализировать данные для продуктов Touring-2000 Blue, 50 и Touring-3000 Blue, 62 проданы 3 марта 2014 года. Команда нуждается в следующих задачах:
- Общее количество продаж на продукт.
- Скользящее среднее для последних трех продаж.
- Сумма продаж для каждого продукта за последние три заказа.
- Итоговая сумма для обоих продуктов на указанную дату.
Используя инструкцию SELECT
с предложением WINDOW
, вы можете легко получить этот отчет с помощью одного запроса. Ниже приведен пример выполнения этого запроса.
SELECT
SOH.SalesOrderID,
P.Name,
SOD.OrderQty,
SOD.UnitPrice,
SOD.LineTotal,
SUM(SOD.LineTotal) OVER product_sales AS TotalSalesPerProduct,
AVG(SOD.LineTotal) OVER last_three_sales AS LastThreeSalesAverageByProduct,
SUM(SOD.LineTotal) OVER last_three_sales AS LastThreeSalesSumByProduct,
SUM(SOD.LineTotal) OVER running_total AS RunningTotal
FROM [AdventureWorks2012].[Sales].[SalesOrderDetail] SOD
JOIN [AdventureWorks2012].[Sales].[SalesOrderHeader] SOH on SOD.SalesOrderID = SOH.SalesOrderID
JOIN [AdventureWorks2012].[Production].[Product] P ON P.ProductID = SOD.ProductID
WHERE P.Name IN ('Touring-2000 Blue, 50', 'Touring-3000 Blue, 62')
AND SOH.OrderDate = '2014-03-01'
WINDOW
-- Partition by product name window.
product_sales AS (PARTITION BY P.Name),
-- Last 3 sales by Product name order by date and Sales order ID.
last_three_sales AS (PARTITION BY P.Name ORDER BY SOH.OrderDate, SOH.SalesOrderID ROWS BETWEEN 2 PRECEDING AND CURRENT ROW),
-- The current an all the previous sales window.
running_total AS (ORDER BY SOH.OrderDate, SOH.SalesOrderID ROWS UNBOUNDED PRECEDING)
В этом примере мы использовали WINDOW
предложение для определения трех именованных спецификаций окна: product_sales, last_three_sales и running_total. Мы повторно использовали спецификацию окна last_three_sales для вычисления как скользящего среднего последних трех продаж, так и суммы продаж в последних трех заказах. Использование предложения WINDOW
упрощает чтение кода.
Результаты:
ID заказа на продажу | Имя | КоличествоЗаказа | Цена за единицу | Итог по строкам | Общие продажи по продукту | Среднее за последние три продажи по продукту | Сумма последних трех продаж по продукту | Текущий итог |
---|---|---|---|---|---|---|---|---|
67261 | Туринг-2000 Синий, 50 | 1 | 728.91 | 728.910000 | 9475.830000 | 728.910000 | 728.910000 | 728.910000 |
67261 | Туринг-3000 Синий, 62 | 4 | 445.41 | 1781.640000 | 4008.690000 | 1781.640000 | 1781.640000 | 2510.550000 |
67279 | Туринг-3000 Синий, 62 | 1 | 445.41 | 445.410000 | 4008.690000 | 1113.525000 | 2227.050000 | 2955.960000 |
67279 | Туринг-2000 Синий, 50 | 3 | 728.91 | 2186.730000 | 9475.830000 | 1457.820000 | 2915.640000 | 5142.690000 |
67282 | Туринг-2000 Синий, 50 | 2 | 728.91 | 1457.820000 | 9475.830000 | 1457.820000 | 4373.460000 | 6600.510000 |
67282 | Туринг-3000 Синий, 62 | 2 | 445.41 | 890.820000 | 4008.690000 | 1039.290000 | 3117.870000 | 7491.330000 |
67322 | Туринг-3000 Синий, 62 | 1 | 445.41 | 445.410000 | 4008.690000 | 593.880000 | 1781.640000 | 7936.740000 |
67322 | Туринг-2000 Синий, 50 | 5 | 728.91 | 3644.550000 | 9475.830000 | 2429.700000 | 7289.100000 | 11581.290000 |
67342 | Туринг-2000 Синий, 50 | 2 | 728.91 | 1457.820000 | 9475.830000 | 2186.730000 | 6560.190000 | 13039.110000 |
67342 | Туринг-3000 Синий, 62 | 1 | 445.41 | 445.410000 | 4008.690000 | 593.880000 | 1781.640000 | 13484.520000 |
Предложение WINDOW
в SQL Server 2022 является ценным дополнением для аналитиков данных, разработчиков и администраторов баз данных, работающих с SQL Server, так как упрощает сложные вычисления и агрегации, оптимизируя использование оконных функций в инструкциях SELECT
.