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);
Eu li sobre essa cláusula e não entendo por que preciso dela. O que a função Over
faz? O que Partitioning By
faz? Por que não consigo fazer uma consulta com a escrita Group By SalesOrderID
?
mysql
sql
sql-server
aggregate-functions
clause
Com cores voadoras
fonte
fonte
Respostas:
Você pode usar
GROUP BY SalesOrderID
. A diferença é que, com GROUP BY, você pode ter apenas os valores agregados para as colunas que não estão incluídas em GROUP BY.Por outro lado, usando funções agregadas em janelas em vez de GROUP BY, você pode recuperar valores agregados e não agregados. Ou seja, embora você não esteja fazendo isso na sua consulta de exemplo, você pode recuperar os
OrderQty
valores individuais e suas somas, contagens, médias etc. em grupos dos mesmosSalesOrderID
s.Aqui está um exemplo prático de por que os agregados com janelas são ótimos. Suponha que você precise calcular qual a porcentagem de um total de cada valor. Sem agregados em janela, você teria que derivar primeiro uma lista de valores agregados e depois associá-la ao conjunto de linhas original, ou seja:
Agora veja como você pode fazer o mesmo com um agregado em janela:
Muito mais fácil e limpo, não é?
fonte
A
OVER
cláusula é poderosa, pois você pode ter agregados em diferentes intervalos ("janelas"), independentemente de você usarGROUP BY
ou nãoExemplo: obter contagem por
SalesOrderID
e contagem de todosObter
COUNT
s diferentes , nãoGROUP BY
fonte
Se você quisesse apenas Agrupar por SalesOrderID, não seria possível incluir as colunas ProductID e OrderQty na cláusula SELECT.
A cláusula PARTITION BY permite que você divida suas funções agregadas. Um exemplo óbvio e útil seria se você desejasse gerar números de linha para linhas de pedido em um pedido:
(Minha sintaxe pode estar um pouco desligada)
Você retornaria algo como:
fonte
Deixe-me explicar com um exemplo e você poderá ver como isso funciona.
Supondo que você tenha a seguinte tabela DIM_EQUIPMENT:
Executar abaixo do SQL
O resultado seria o seguinte
Veja o que aconteceu.
Você pode contar sem Agrupar por no ANO e Combinar com ROW.
Outra maneira interessante de obter o mesmo resultado, se abaixo, usando a cláusula WITH, WITH funciona como VIEW in-line e pode simplificar a consulta, especialmente as mais complexas, o que não é o caso aqui, já que estou apenas tentando mostrar o uso
fonte
A cláusula OVER, quando combinada com PARTITION BY, afirma que a chamada de função anterior deve ser feita analiticamente, avaliando as linhas retornadas da consulta. Pense nisso como uma instrução GROUP BY embutida.
OVER (PARTITION BY SalesOrderID)
está informando que, para a função SUM, AVG, etc ..., retorne o valor OVER um subconjunto dos registros retornados da consulta e PARTITION que subconjunto BY a chave estrangeira SalesOrderID.Então, somaremos todos os registros OrderQty para CADA ORÇAMENTO DE VENDA ÚNICO, e esse nome de coluna será chamado 'Total'.
É um meio MUITO mais eficiente do que usar várias visualizações embutidas para descobrir as mesmas informações. Você pode colocar essa consulta em uma exibição embutida e filtrar no Total então.
fonte
Query Petition
Cláusula também chamada .Semelhante à
Group By
CláusulaSintaxe:
function (...) OVER (PARTITION BY col1 col3, ...)
Funções
COUNT()
,SUM()
,MIN()
,MAX()
, etc.ROW_NUMBER()
,RATION_TO_REOIRT()
, etc.)Mais informações com o exemplo: http://msdn.microsoft.com/en-us/library/ms189461.aspx
fonte
Isso é resultado da consulta. A tabela usada como fonte é o mesmo exceção que não possui a última coluna. Esta coluna é uma soma móvel da terceira.
Inquerir:
(a tabela vai como public.iuk)
É um pouco acima do nível dbase (1986), não sei por que mais de 25 anos foram necessários para finalizar.
fonte