USE AdventureWorks2008R2;
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);
Я читал об этом пункте и не понимаю, зачем мне это нужно. Что делает функция Over
? Что делает Partitioning By
? Почему я не могу сделать запрос с письменной форме Group By SalesOrderID
?
mysql
sql
sql-server
aggregate-functions
clause
WithFlyingColors
источник
источник
Ответы:
Вы можете использовать
GROUP BY SalesOrderID
. Разница в том, что с GROUP BY вы можете иметь только агрегированные значения для столбцов, которые не включены в GROUP BY.Напротив, используя оконные агрегатные функции вместо GROUP BY, вы можете получать как агрегированные, так и неагрегированные значения. То есть, хотя вы не делаете этого в своем примере запроса, вы можете получить как отдельные
OrderQty
значения, так и их суммы, значения, средние значения и т. Д. По группам с одинаковыми значениямиSalesOrderID
.Вот практический пример того, почему оконные агрегаты хороши. Предположим, вам нужно рассчитать, каков процент от общего значения. Без оконных агрегатов вам придется сначала получить список агрегированных значений, а затем присоединить его к исходному набору строк, например, так:
Теперь посмотрим, как вы можете сделать то же самое с оконным агрегатом:
Намного проще и чище, не так ли?
источник
Предложение
OVER
является мощным в том смысле, что вы можете иметь агрегаты в разных диапазонах («оконный»), независимо от того, используете выGROUP BY
или нетПример: получить количество
SalesOrderID
и количество всехПолучить разные
COUNT
с, нетGROUP BY
источник
Если вы хотите использовать только GROUP BY SalesOrderID, вы не сможете включить столбцы ProductID и OrderQty в предложение SELECT.
Предложение PARTITION BY позволяет вам разбить ваши агрегатные функции. Один очевидный и полезный пример будет, если вы хотите сгенерировать номера строк для строк заказа в заказе:
(Мой синтаксис может быть немного отключен)
Затем вы получите что-то вроде:
источник
Позвольте мне объяснить на примере, и вы сможете увидеть, как это работает.
Предполагая, что у вас есть следующая таблица DIM_EQUIPMENT:
Запустите ниже SQL
Результат будет как ниже
Посмотри, что случилось.
Вы можете рассчитывать без Group By на YEAR и совпадать с ROW.
Другой интересный способ получить тот же результат, если, как показано ниже, используя предложение WITH, WITH работает как встроенный VIEW и может упростить запрос, особенно сложные, хотя здесь это не так, поскольку я просто пытаюсь показать использование
источник
Предложение OVER в сочетании с PARTITION BY указывает на то, что предыдущий вызов функции должен выполняться аналитически путем оценки возвращаемых строк запроса. Думайте об этом как о встроенном выражении GROUP BY.
OVER (PARTITION BY SalesOrderID)
заявляет, что для функции SUM, AVG и т. д. ... возвращает значение OVER подмножество возвращенных записей из запроса и PARTITION, которое подмножество внешним ключом SalesOrderID.Поэтому мы будем СУММАТЬ каждую запись OrderQty для КАЖДОГО УНИКАЛЬНОГО SalesOrderID, и имя этого столбца будет называться «Всего».
Это НАМНОГО более эффективное средство, чем использование нескольких встроенных представлений для поиска одной и той же информации. Вы можете поместить этот запрос во встроенное представление и затем отфильтровать по итоговому значению.
источник
Query Petition
пункт.Аналогично
Group By
пунктуСинтаксис:
function (...) OVER (PARTITION BY col1 col3, ...)
функции
COUNT()
,SUM()
,MIN()
,MAX()
, и т.д.ROW_NUMBER()
,RATION_TO_REOIRT()
и т. Д.)Дополнительная информация с примером: http://msdn.microsoft.com/en-us/library/ms189461.aspx
источник
Это результат запроса. Таблица, используемая в качестве источника, та же, за исключением того, что она не имеет последнего столбца. Этот столбец представляет собой движущуюся сумму третьего.
Запрос:
(таблица идет как public.iuk)
Это уровень чуть выше базы dbase (1986), я не знаю, почему для его завершения потребовалось более 25 лет.
источник