RANK le da la clasificación dentro de su partición ordenada. A los empates se les asigna el mismo rango, y se omiten las siguientes clasificaciones. Entonces, si tiene 3 artículos en el rango 2, el siguiente rango en la lista sería el 5.
DENSE_RANK nuevamente le da la clasificación dentro de su partición ordenada, pero los rangos son consecutivos. No se omiten los rangos si hay rangos con varios elementos.
En cuanto a los nulos, depende de la cláusula ORDER BY. Aquí hay un script de prueba simple con el que puedes jugar para ver qué sucede:
with q as(select10 deptno,'rrr' empname,10000.00 sal from dual unionallselect11,'nnn',20000.00from dual unionallselect11,'mmm',5000.00from dual unionallselect12,'kkk',30000from dual unionallselect10,'fff',40000from dual unionallselect10,'ddd',40000from dual unionallselect10,'bbb',50000from dual unionallselect10,'xxx',nullfrom dual unionallselect10,'ccc',50000from dual)select empname, deptno, sal, rank()over(partitionby deptno orderby sal nulls first) r, dense_rank()over(partitionby deptno orderby sal nulls first) dr1, dense_rank()over(partitionby deptno orderby sal nulls last) dr2from q;
EMP DEPTNO SAL R DR1 DR2--- ---------- ---------- ---------- ---------- ----------
xxx 10114
rrr 1010000221
fff 1040000332
ddd 1040000332
ccc 1050000543
bbb 1050000543
mmm 115000111
nnn 1120000222
kkk 12300001119rows selected.
muy buena idea usar select union all from dual para generar datos de muestra sin crear ninguna tabla
Jean-Christophe Blanchard
@ Jean-ChristopheBlanchard, aunque podría usar fácilmente una valuescláusula.
Comodín el
1
@Wildcard En PG, sí. En Oracle, no . Al menos no a partir de 11. Todavía no me he encontrado con 12 en productos.
jpmc26
Eliminar from dualpara generar estos datos en Redshift
Gaurav
44
Ivan, RANK me da una idea de dónde estoy en relación con todos los que están delante de mí. DENSE_RANK me dice el rango absoluto. Puede que tenga el segundo salario más alto, pero podría haber 100 personas por delante. Cuál es mejor depende de la pregunta que estoy respondiendo.
CREATETABLE t ASSELECT'a' v FROM dual UNIONALLSELECT'a'FROM dual UNIONALLSELECT'a'FROM dual UNIONALLSELECT'b'FROM dual UNIONALLSELECT'c'FROM dual UNIONALLSELECT'c'FROM dual UNIONALLSELECT'd'FROM dual UNIONALLSELECT'e'FROM dual;SELECT
v,
ROW_NUMBER()OVER(ORDERBY v) row_number,
RANK()OVER(ORDERBY v) rank,
DENSE_RANK()OVER(ORDERBY v) dense_rank
FROM t
ORDERBY v;
Lo anterior producirá:
+---+------------+------+------------+| V | ROW_NUMBER | RANK | DENSE_RANK |+---+------------+------+------------+| a |1|1|1|| a |2|1|1|| a |3|1|1|| b |4|4|2|| c |5|5|3|| c |6|5|3|| d |7|7|4|| e |8|8|5|+---+------------+------+------------+
En palabras
ROW_NUMBER() atribuye un valor único a cada fila
RANK() atribuye el mismo número de fila al mismo valor, dejando "agujeros"
DENSE_RANK() atribuye el mismo número de fila al mismo valor, sin dejar "agujeros"
rank () : se utiliza para clasificar un registro dentro de un grupo de filas.
dense_rank () : la función DENSE_RANK actúa como la función RANK, excepto que asigna rangos consecutivos.
Consulta -
select
ENAME,SAL,RANK()over(orderby SAL) RANK
from
EMP;
Salida -
+--------+------+------+| ENAME | SAL | RANK |+--------+------+------+| SMITH |800|1|| JAMES |950|2|| ADAMS |1100|3|| MARTIN |1250|4|| WARD |1250|4|| TURNER |1500|6|+--------+------+------+
Consulta -
select
ENAME,SAL,dense_rank()over(orderby SAL) DEN_RANK
from
EMP;
Salida -
+--------+------+-----------+| ENAME | SAL | DEN_RANK |+--------+------+-----------+| SMITH |800|1|| JAMES |950|2|| ADAMS |1100|3|| MARTIN |1250|4|| WARD |1250|4|| TURNER |1500|5|+--------+------+-----------+
La única diferencia entre las funciones RANK () y DENSE_RANK () es en los casos en que hay un "empate"; es decir, en casos donde múltiples valores en un conjunto tienen la misma clasificación. En tales casos, RANK () asignará "rangos" no consecutivos a los valores del conjunto (lo que dará como resultado brechas entre los valores de clasificación de enteros cuando haya un empate), mientras que DENSE_RANK () asignará rangos consecutivos a los valores en el set (por lo que no habrá espacios entre los valores de clasificación de enteros en el caso de un empate).
Por ejemplo, considere el conjunto {25, 25, 50, 75, 75, 100}. Para tal conjunto, RANK () devolverá {1, 1, 3, 4, 4, 6} (tenga en cuenta que los valores 2 y 5 se omiten), mientras que DENSE_RANK () devolverá {1,1,2,3, 3,4}.
La función SQL Rank () genera el rango de los datos dentro del conjunto ordenado de valores, pero el siguiente rango después del rango anterior es row_number de esa fila en particular. Por otro lado, la función Dense_Rank () SQL genera el siguiente número en lugar de generar row_number. A continuación se muestra el ejemplo de SQL que aclarará el concepto:
Rank(), Dense_rank(), row_number()
Todas estas son funciones de ventana, lo que significa que actúan como ventana sobre un conjunto de entradas ordenadas al principio. Estas ventanas tienen una funcionalidad diferente asociada según el requisito. Heres los 3 anteriores:
row_number()
Comenzando por row_number()esto forma la base de estas funciones de ventana relacionadas. row_number()como su nombre lo indica, da un número único al conjunto de filas sobre el que se ha aplicado. Similar a dar un número de serie a cada fila.
Rank()
Una subversión de row_number()se puede decir como rank(). Rank () se usa para dar el mismo número de serie a las filas ordenadas del conjunto que son duplicados, pero aún mantiene el recuento mantenido como similar a un row_number()para todos aquellos después de duplicar el significado de rank (), como se muestra a continuación, por ejemplo. Para los datos 2 row_number () = rank (), lo que significa que ambos difieren en forma de duplicados.
Data row_number() rank() dense_rank()1111121113112442
Finalmente,
Dense_rank () es una versión extendida de rank () ya que el nombre sugiere que es denso porque, como puede ver en el ejemplo anterior, rank () = dense_rank () para todos los datos 1 pero solo para los datos 2 difiere en la forma en que mantiene el orden de rango () del rango anterior () no los datos reales
La única diferencia entre las funciones RANK () y DENSE_RANK () es en los casos en que hay un "empate"; es decir, en casos donde múltiples valores en un conjunto tienen la misma clasificación. En tales casos, RANK () asignará "rangos" no consecutivos a los valores del conjunto (lo que dará como resultado brechas entre los valores de clasificación de enteros cuando haya un empate), mientras que DENSE_RANK () asignará rangos consecutivos a los valores en el set (por lo que no habrá espacios entre los valores de clasificación de enteros en el caso de un empate).
Por ejemplo, considere el conjunto {30, 30, 50, 75, 75, 100}. Para tal conjunto, RANK () devolverá {1, 1, 3, 4, 4, 6} (tenga en cuenta que los valores 2 y 5 se omiten), mientras que DENSE_RANK () devolverá {1,1,2,3, 3,4}.
values
cláusula.from dual
para generar estos datos en RedshiftEste artículo aquí lo explica muy bien. Esencialmente, puedes verlo como tal:
Lo anterior producirá:
En palabras
ROW_NUMBER()
atribuye un valor único a cada filaRANK()
atribuye el mismo número de fila al mismo valor, dejando "agujeros"DENSE_RANK()
atribuye el mismo número de fila al mismo valor, sin dejar "agujeros"fuente
fuente
rank () : se utiliza para clasificar un registro dentro de un grupo de filas.
dense_rank () : la función DENSE_RANK actúa como la función RANK, excepto que asigna rangos consecutivos.
Consulta -
Salida -
Consulta -
Salida -
fuente
Row_number()
-> Utilizado para generar número de serieDense_rank()
dará un rango continuo pero el rango saltará el rango en caso de choque de rango.fuente
La única diferencia entre las funciones RANK () y DENSE_RANK () es en los casos en que hay un "empate"; es decir, en casos donde múltiples valores en un conjunto tienen la misma clasificación. En tales casos, RANK () asignará "rangos" no consecutivos a los valores del conjunto (lo que dará como resultado brechas entre los valores de clasificación de enteros cuando haya un empate), mientras que DENSE_RANK () asignará rangos consecutivos a los valores en el set (por lo que no habrá espacios entre los valores de clasificación de enteros en el caso de un empate).
Por ejemplo, considere el conjunto {25, 25, 50, 75, 75, 100}. Para tal conjunto, RANK () devolverá {1, 1, 3, 4, 4, 6} (tenga en cuenta que los valores 2 y 5 se omiten), mientras que DENSE_RANK () devolverá {1,1,2,3, 3,4}.
fuente
La función SQL Rank () genera el rango de los datos dentro del conjunto ordenado de valores, pero el siguiente rango después del rango anterior es row_number de esa fila en particular. Por otro lado, la función Dense_Rank () SQL genera el siguiente número en lugar de generar row_number. A continuación se muestra el ejemplo de SQL que aclarará el concepto:
Generará el siguiente resultado:
fuente
Rango y Rango denso da el rango en el conjunto de datos particionado.
Rango (): no te da números enteros consecutivos.
Dense_rank (): te da números enteros consecutivos.
En la imagen de arriba, el rango de 10008 zip es 2 por función dense_rank () y 24 por rango (), ya que considera el número de fila.
fuente
Rank(), Dense_rank(), row_number()
Todas estas son funciones de ventana, lo que significa que actúan como ventana sobre un conjunto de entradas ordenadas al principio. Estas ventanas tienen una funcionalidad diferente asociada según el requisito. Heres los 3 anteriores:row_number()
Comenzando por
row_number()
esto forma la base de estas funciones de ventana relacionadas.row_number()
como su nombre lo indica, da un número único al conjunto de filas sobre el que se ha aplicado. Similar a dar un número de serie a cada fila.Rank()
Una subversión de
row_number()
se puede decir comorank()
. Rank () se usa para dar el mismo número de serie a las filas ordenadas del conjunto que son duplicados, pero aún mantiene el recuento mantenido como similar a unrow_number()
para todos aquellos después de duplicar el significado de rank (), como se muestra a continuación, por ejemplo. Para los datos 2 row_number () = rank (), lo que significa que ambos difieren en forma de duplicados.Finalmente,
Dense_rank () es una versión extendida de rank () ya que el nombre sugiere que es denso porque, como puede ver en el ejemplo anterior, rank () = dense_rank () para todos los datos 1 pero solo para los datos 2 difiere en la forma en que mantiene el orden de rango () del rango anterior () no los datos reales
fuente
La única diferencia entre las funciones RANK () y DENSE_RANK () es en los casos en que hay un "empate"; es decir, en casos donde múltiples valores en un conjunto tienen la misma clasificación. En tales casos, RANK () asignará "rangos" no consecutivos a los valores del conjunto (lo que dará como resultado brechas entre los valores de clasificación de enteros cuando haya un empate), mientras que DENSE_RANK () asignará rangos consecutivos a los valores en el set (por lo que no habrá espacios entre los valores de clasificación de enteros en el caso de un empate).
Por ejemplo, considere el conjunto {30, 30, 50, 75, 75, 100}. Para tal conjunto, RANK () devolverá {1, 1, 3, 4, 4, 6} (tenga en cuenta que los valores 2 y 5 se omiten), mientras que DENSE_RANK () devolverá {1,1,2,3, 3,4}.
fuente