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 !