Введение в новое предложение SELECT WINDOW в SQL Server
Пересказ статьи Hasan Savran. Introduction to new the SELECT WINDOW Clause in SQL Server
Операции WINDOW в SQL Server бывает трудно понять. Я полагаю, что одна из главных причин этого заключается в длинном и повторяющемся коде, который они требуют. Предложение SELECT...WINDOW поможет удалить повторяющийся код и, надеюсь, сделает операции WINDOW более дружественными.
Давайте взглянем сначала на следующий пример. Когда вы смотрите на это впервые, то кажется, что происходит много всего. Потом вы понимаете, что здесь много повторяющегося кода.
SELECT DISTINCT i.AccountsPersonId,
TotalInvoices = COUNT(i.InvoiceId)
OVER (PARTITION BY i.AccountsPersonId ORDER BY i.AccountsPersonId),
TotalProfit = SUM(l.LineProfit)
OVER (PARTITION BY i.AccountsPersonId ORDER BY i.AccountsPersonId),
AvgQuantity = AVG(l.Quantity)
OVER (PARTITION BY i.AccountsPersonId ORDER BY i.AccountsPersonId),
TotalDryItems = SUM(i.TotalDryItems)
OVER (PARTITION BY i.AccountsPersonId ORDER by i.AccountsPersonId),
TotalChillerItems = SUM(i.TotalChillerItems)
OVER (PARTITION BY i.AccountsPersonId ORDER by i.AccountsPersonId)
FROM Sales.Invoices AS i
JOIN Sales.InvoiceLines AS l ON i.InvoiceId = l.InvoiceId
WHERE invoicedate BETWEEN '2013-1-1' and '2014-1-1'
Чтобы решить эту проблему, команда SQL Server нашла отличное решение удалить весь повторяющийся код, и сделать код чище. Вы можете определить PARTITION BY и ORDER BY в новом предложении WINDOW и использовать его повсюду в вашем запросе. Прежде чем попробовать новое предложение в вашей базе данных, вы должны быть уверены, что база данных имеет уровень совместимости 160 или выше. Вы можете изменить уровень совместимости базы данных при помощи следующей команды.
ALTER DATABASE DatabaseName SET COMPATIBILITY_LEVEL = 160
Теперь вы можете переписать код с предложением WINDOW. В следующем примере я определяю WINDOW в конце запроса, и использую определенное окно в операторе SELECT.
SELECT DISTINCT i.AccountsPersonId,
COUNT(i.InvoiceId) OVER accpidWin AS TotalInvoices,
SUM(l.LineProfit) OVER accpidWin AS TotalProfit,
AVG(l.Quantity) OVER accpidWin AS AvgQuantity,
SUM(i.TotalDryItems) OVER accpidWin AS TotalDryItems,
SUM(i.TotalChillerItems) OVER accpidWin AS TotalChillerItems
FROM Sales.Invoices AS i
JOIN Sales.InvoiceLines AS l ON i.InvoiceId = l.InvoiceId
WHERE invoicedate BETWEEN '2013-1-1' and '2014-1-1'
WINDOW accpidWin AS (PARTITION BY i.AccountsPersonId ORDER BY i.AccountsPersonId)
Новый синтаксис помогает организовать код и сделать его чище. Запрос возвращает следующие результаты:
Обратные ссылки
Автор не разрешил комментировать эту запись
Комментарии
Показывать комментарии Как список | Древовидной структурой