Skip to content

Введение в новое предложение 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)

Новый синтаксис помогает организовать код и сделать его чище. Запрос возвращает следующие результаты:



Категории: T-SQL

Обратные ссылки

Нет обратных ссылок

Комментарии

Показывать комментарии Как список | Древовидной структурой

Нет комментариев.

Автор не разрешил комментировать эту запись

Добавить комментарий

Enclosing asterisks marks text as bold (*word*), underscore are made via _word_.
Standard emoticons like :-) and ;-) are converted to images.

To prevent automated Bots from commentspamming, please enter the string you see in the image below in the appropriate input box. Your comment will only be submitted if the strings match. Please ensure that your browser supports and accepts cookies, or your comment cannot be verified correctly.
CAPTCHA

Form options

Добавленные комментарии должны будут пройти модерацию прежде, чем будут показаны.