Published on

February 28, 2012

Compreendendo as Funções de Classificação do SQL Server

O SQL Server fornece várias funções de classificação que podem ser usadas para classificar linhas em um conjunto de resultados sobre uma partição. Essas funções incluem ROW_NUMBER, RANK, DENSE_RANK e NTILE. Neste artigo, exploraremos essas funções de classificação e forneceremos exemplos de seu uso.

ROW_NUMBER

A função ROW_NUMBER é a mais simples das funções de classificação. Ela atribui um número consecutivo a cada linha no conjunto de resultados com base na ordem especificada na cláusula OVER. Se uma partição for especificada, a numeração reinicia para cada partição. Aqui está um exemplo:

SELECT ProductID, SUM(OrderQty) AS ProductOrderCount, ROW_NUMBER() OVER (ORDER BY SUM(OrderQty) DESC) AS Row
FROM Sales.SalesOrderDetail
WHERE OrderDate BETWEEN '1/1/2008' AND '12/31/2008'
GROUP BY ProductID
ORDER BY Row

Esta consulta recupera os 10 principais produtos vendidos em 2008 e atribui um número de linha com base na ordem da soma das quantidades de pedidos. O conjunto de resultados incluirá o ProductID, a quantidade total do pedido e o número da linha.

RANK

A função RANK atribui uma classificação a cada linha no conjunto de resultados. Se houver empates, as linhas empatadas receberão a mesma classificação e a próxima classificação será pulada. Aqui está um exemplo:

SELECT ProductID, SUM(OrderQty) AS ProductOrderCount, RANK() OVER (ORDER BY SUM(OrderQty) DESC) AS Ranking
FROM Sales.SalesOrderDetail
WHERE OrderDate BETWEEN '1/1/2008' AND '12/31/2008'
GROUP BY ProductID
HAVING SUM(OrderQty) BETWEEN 400 AND 500
ORDER BY Ranking

Neste exemplo, a consulta recupera produtos com uma quantidade total de pedidos entre 400 e 500 e atribui uma classificação com base na ordem da soma das quantidades de pedidos. Se houver empates, as linhas empatadas receberão a mesma classificação e a próxima classificação será pulada.

DENSE_RANK

A função DENSE_RANK é semelhante à função RANK, mas não pula classificações para linhas empatadas. Cada linha empatada receberá a mesma classificação e a próxima classificação será atribuída de acordo. Aqui está um exemplo:

SELECT ProductID, SUM(OrderQty) AS ProductOrderCount, DENSE_RANK() OVER (ORDER BY SUM(OrderQty) DESC) AS Ranking
FROM Sales.SalesOrderDetail
WHERE OrderDate BETWEEN '1/1/2008' AND '12/31/2008'
GROUP BY ProductID
HAVING SUM(OrderQty) BETWEEN 400 AND 500
ORDER BY Ranking

Neste exemplo, a consulta recupera produtos com uma quantidade total de pedidos entre 400 e 500 e atribui uma classificação densa com base na ordem da soma das quantidades de pedidos. Cada linha empatada receberá a mesma classificação e a próxima classificação será atribuída de acordo.

NTILE

A função NTILE é usada para dividir as linhas igualmente em um número especificado de grupos. Se o número de linhas não for divisível igualmente pelo número de grupos, alguns grupos podem ter uma linha a mais do que os demais. Aqui está um exemplo:

SELECT ProductID, SUM(OrderQty) AS ProductOrderCount, NTILE(4) OVER (ORDER BY SUM(OrderQty) DESC) AS Ranking
FROM Sales.SalesOrderDetail
WHERE OrderDate BETWEEN '1/1/2008' AND '12/31/2008'
GROUP BY ProductID
HAVING SUM(OrderQty) BETWEEN 400 AND 500
ORDER BY Ranking

Neste exemplo, a consulta recupera produtos com uma quantidade total de pedidos entre 400 e 500 e os divide em 4 grupos com base na ordem da soma das quantidades de pedidos. Os grupos com as linhas extras serão classificados primeiro.

Conclusão

O SQL Server fornece funções de classificação poderosas que podem ser usadas para classificar e agrupar conjuntos de resultados. As funções ROW_NUMBER, RANK, DENSE_RANK e NTILE oferecem maneiras diferentes de atribuir classificações e dividir linhas em grupos. Compreender essas funções pode ajudá-lo a analisar e manipular seus dados de forma eficaz.

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.