Comando PARTITION BY
O comando PARTITION BY
é utilizado para dividir uma tabela em partições, permitindo que operações e consultas sejam realizadas de forma mais eficiente em conjuntos de dados específicos.
Este comando é particularmente útil em bases de dados grandes, onde a gestão e a performance podem ser melhoradas através da divisão de dados em segmentos mais pequenos e maleáveis.
Sintaxe básica
A sintaxe básica do comando OVER
é a seguinte:
OVER (
[PARTITION BY coluna]
[ORDER BY coluna [ASC|DESC]]
[ROWS|RANGE entre]
)
- A cláusula
PARTITION BY
é opcional e serve para dividir o conjunto de resultados em partições distintas, baseando-se nos valores de uma coluna especificada. - A cláusula
ORDER BY
também é opcional e determina a ordem das linhas dentro de cada partição. - As cláusulas
ROWS
eRANGE
definem o conjunto de linhas a ser considerado antes e depois da linha atual para os cálculos da função de janela.
Exemplo
Calcular a soma acumulativa das vendas para cada produto.
SELECT ProductID, OrderQty, SUM(OrderQty)
OVER (PARTITION BY ProductID ORDER BY SalesOrderID) as CumulativeSum
FROM Sales.SalesOrderDetail;
Ao utilizar PARTITION BY RANGE
, pode-se particionar uma tabela por intervalos, criando partições que contêm algo dentro de certos intervalos.
Calcular a soma acumulada de vendas para cada produto, mas apenas para pedidos do mesmo dia
SELECT D.SalesOrderID, H.OrderDate, D.OrderQty,
SUM(D.OrderQty) OVER(PARTITION BY D.ProductID, CAST(H.OrderDate AS DATE) ORDER BY D.SalesOrderID
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) as CumulativeSum
FROM Sales.SalesOrderDetail AS D
JOIN Sales.SalesOrderHeader AS H ON D.SalesOrderID = H.SalesOrderID;
- Cada pedido contém o
SalesOrderID
, aOrderDate
, eOrderQty
. - A soma acumulada do
OrderQty
e fectuada para cadaProductID
eOrderDate
.