Translate

quarta-feira, 26 de março de 2014

RANK e DENSE RANK

Vamos imaginar que você queira classificar os vendedores de uma empresa.

As funções RANK () e DENSE_RANK () são utilizadas para classificar itens em um agrupamento. 
A diferença entre estas duas funções está na forma como eles lidam com os resultados das colunas com o mesmo valor, RANK deixa uma lacuna na seqüência quando houverem valores iguais e DENSE_RANK () não deixa lacunas. 

No exemplo abaixo, os valores dos dois primeiros vendedores são iguais, Rank classifica os dois vendedores com resultados iguais com o valor 1 e adiciona 3 para o próximo vendedor, deixando uma lacuna na classificação, já Dense Rank também informa 1 para os dois primeiros vendedores, porém informa 2 para o próximo, não deixando lacunas na contagem de classificação.


SELECT vendedor, 
       SUM(valor) total,
       RANK() OVER (ORDER BY SUM(valor ) desc ) AS rank,
       DENSE_RANK() OVER (ORDER BY SUM(valor) desc ) AS dense_rank
FROM   vendas
WHERE  valor IS NOT NULL
and    equipe in (500,900,800,400)
GROUP BY vendedor
ORDER BY rank;

  VENDEDOR TOTAL RANK DENSE_RANK
1 500 1621,2 1 1
2 900 1621,2 1 1
3 800 1609 3 2
4 400 1407,6 4 3


Rank Using Partition

CREATE TABLE test_rank
(column1 NUMBER(2,0),
column2 VARCHAR2(1));
 INSERT INTO test_rank VALUES (1,'A');
INSERT INTO test_rank VALUES(1,'B');
INSERT INTO test_rank VALUES(1,'C');
INSERT INTO test_rank VALUES(2,'A');
INSERT INTO test_rank VALUES(2,'B');
INSERT INTO test_rank VALUES(3,'A');
INSERT INTO test_rank VALUES(3,'B');
INSERT INTO test_rank VALUES(3,'C');
INSERT INTO test_rank VALUES(3,'D');
INSERT INTO test_rank VALUES(4,'A');

 SELECT column1,
        column2,
        RANK() OVER (ORDER BY column1, column2) AS rank_1,
        RANK() OVER( PARTITION BY column1 ORDER BY column1, column2)  rank_2       

FROM test_rank;




Nenhum comentário:

Postar um comentário