Existem 4 funções de ranqueamento que podem ser utilizados com a cláusula OVER:
- ROW_NUMBER
- RANK
- DENSE_RANK
- NTILE
Um exemplo de uso:
1 2 3 4 5 6 7 |
SELECT orderid, custid, val, ROW_NUMBER() OVER(ORDER BY val) AS rownum, RANK() OVER(ORDER BY val) AS rank, DENSE_RANK() OVER(ORDER BY val) AS dense_rank, NTILE(10) OVER(ORDER BY val) AS ntile FROM Sales.OrderValues ORDER BY val; |
O retorno é:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
orderid custid val rownum rank dense_rank ntile ----------- ----------- --------- ------- ------- ---------- ----- 10782 12 12.50 1 1 1 1 10807 27 18.40 2 2 2 1 10586 66 23.80 3 3 3 1 10767 76 28.00 4 4 4 1 10898 54 30.00 5 5 5 1 10900 88 33.75 6 6 6 1 10883 48 36.00 7 7 7 1 11051 41 36.00 8 7 7 1 10815 71 40.00 9 9 8 1 10674 38 45.00 10 10 9 1 ... 10691 63 10164.80 821 821 786 10 10540 63 10191.70 822 822 787 10 10479 65 10495.60 823 823 788 10 10897 37 10835.24 824 824 789 10 10817 39 10952.85 825 825 790 10 10417 73 11188.40 826 826 791 10 10889 65 11380.00 827 827 792 10 11030 71 12615.05 828 828 793 10 10981 34 15810.00 829 829 794 10 10865 63 16387.50 830 830 795 10 |
1 |
(830 row(s) affected) |
A função ROW_NUMBER() retorna uma ordenação sequencial para o resultado da consulta, baseado no que foi especificado no ORDER BY da cláusula OVER. Note que eu poderia retornar a ordenação pela coluna custid, modificando apenas a coluna rownum e mantendo a mesma ordem no retorno da consulta.
Ao contrário da função ROW_NUMBER(), onde cada registro obrigatoriamente possuirá um valor distinto (inclusive desconsiderando os empates – veja as linhas 7 e 8), as funções RANK e DENSE_RANK levam os empates em consideração. A diferença entre elas diz respeito ao próximo registro. Enquanto a função RANK considera a quantidade de linhas para determinar o próximo registro (dois empates com valor 7 e o próximo registro com valor 9), a função DENSE_RANK leva em consideração os registros distintos (mesmo estando na linha 9, o empate nos dois registros anteriores produziu como retorno o valor 8).
A função NTILE faz com que o retorno seja agrupado em quantidades iguais (ou a mais próxima possível). Como a consulta possui 830 registros e foi solicitado dividir em 10 grupos, o SQL SERVER dividiu em 10 grupos iguais de 83 registros cada. Se o retorno fosse, por exemplo, de 832 registros, ele incluiria 1 registro a mais nos 2 primeiros grupos, ou seja, o primeiro e o segundo bloco teriam 84 registros, enquanto os demais teriam 83 registros cada.
Fala Logan, td certo?
Logan, vê se tu pode me ajudar:
Tenho que fazer um select que quando um determinado campo é 0 ele deve fazer uma subselect e quando 1 outra subselect. Tem como fazer isso?
Ex: select * from abc
where campo = 1 then codigo in (select xxx)
or campo = 0 then codigo in (select yyyy)
Valeu a força,
Abração
Fausto,
utilize o CASE para fazer isso cara !