Función de ventana DENSE_RANK - Amazon Redshift

Función de ventana DENSE_RANK

La función de ventana DENSE_RANK determina la clasificación de un valor en un grupo de valores, según la expresión ORDER BY en la cláusula OVER. Si hay una cláusula opcional PARTITION BY, las clasificaciones de restablecen para cada grupo de filas. Las filas con valores iguales para el criterio de clasificación reciben la misma clasificación. La función DENSE_RANK difiere de RANK en un aspecto: si se vinculan dos o más filas, no hay brecha en la secuencia de valores clasificados. Por ejemplo, si dos filas tienen clasificación 1, la siguiente clasificación es 2.

Puede tener funciones de clasificación con diferentes cláusulas PARTITION BY y ORDER BY en la misma consulta.

Sintaxis

DENSE_RANK() OVER ( [ PARTITION BY expr_list ] [ ORDER BY order_list ] )

Argumentos

( )

La función no toma argumentos, pero se necesitan los paréntesis vacíos.

OVER

Las cláusulas de ventana para la función DENSE_RANK.

PARTITION BY expr_list

(Opcional) Una o más expresiones que definen la ventana.

ORDER BY order_list

(Opcional) La expresión en que se basan los valores de clasificación. Si no se especifica PARTITION BY, ORDER BY utiliza toda la tabla. Si se omite ORDER BY, el valor de retorno es 1 para todas las filas.

Si ORDER BY no produce una ordenación única, el orden de las filas no es determinístico. Para obtener más información, consulte Ordenación única de datos para funciones de ventana.

Tipo de retorno

INTEGER

Ejemplos

En los siguientes ejemplos se utiliza la tabla de ejemplos para las funciones de ventana. Para obtener más información, consulte Tabla de muestra para ejemplos de funciones de ventana.

En el siguiente ejemplo, se ordena la tabla según la cantidad vendida y se asigna a cada fila tanto una clasificación densa como una regular. Los resultados se ordenan después de que se apliquen los resultados de la función de ventana.

SELECT salesid, qty, DENSE_RANK() OVER(ORDER BY qty DESC) AS d_rnk, RANK() OVER(ORDER BY qty DESC) AS rnk FROM winsales ORDER BY 2,1; +---------+-----+-------+-----+ | salesid | qty | d_rnk | rnk | +---------+-----+-------+-----+ | 10001 | 10 | 5 | 8 | | 10006 | 10 | 5 | 8 | | 30001 | 10 | 5 | 8 | | 40005 | 10 | 5 | 8 | | 30003 | 15 | 4 | 7 | | 20001 | 20 | 3 | 4 | | 20002 | 20 | 3 | 4 | | 30004 | 20 | 3 | 4 | | 10005 | 30 | 2 | 2 | | 30007 | 30 | 2 | 2 | | 40001 | 40 | 1 | 1 | +---------+-----+-------+-----+

Tenga en cuenta la diferencia entre las clasificaciones asignadas al mismo conjunto de filas cuando se usan las funciones DENSE_RANK y RANK en simultáneo en la misma consulta.

En el siguiente ejemplo, se divide la tabla según sellerid, se ordena cada partición según la cantidad y se asigna una clasificación densa a cada fila. Los resultados se ordenan después de que se apliquen los resultados de la función de ventana.

SELECT salesid, sellerid, qty, DENSE_RANK() OVER(PARTITION BY sellerid ORDER BY qty DESC) AS d_rnk FROM winsales ORDER BY 2,3,1; +---------+----------+-----+-------+ | salesid | sellerid | qty | d_rnk | +---------+----------+-----+-------+ | 10001 | 1 | 10 | 2 | | 10006 | 1 | 10 | 2 | | 10005 | 1 | 30 | 1 | | 20001 | 2 | 20 | 1 | | 20002 | 2 | 20 | 1 | | 30001 | 3 | 10 | 4 | | 30003 | 3 | 15 | 3 | | 30004 | 3 | 20 | 2 | | 30007 | 3 | 30 | 1 | | 40005 | 4 | 10 | 2 | | 40001 | 4 | 40 | 1 | +---------+----------+-----+-------+

Para utilizar el último ejemplo con éxito, utilice el siguiente comando para insertar una fila en la tabla WINSALES. Esta fila tiene el mismo buyerid, sellerid y qtysold que otra fila. Esto hará que dos filas coincidan en el último ejemplo y, por lo tanto, mostrará la diferencia entre las funciones DENSE_RANK y RANK.

INSERT INTO winsales VALUES(30009, '2/2/2003', 3, 'b', 20, NULL);

En el siguiente ejemplo, se divide la tabla según buyerid y sellerid, se ordena cada partición según la cantidad y se asigna a cada fila una clasificación densa y regular. Los resultados se ordenan después de que se aplique la función de ventana.

SELECT salesid, sellerid, qty, buyerid, DENSE_RANK() OVER(PARTITION BY buyerid, sellerid ORDER BY qty DESC) AS d_rnk, RANK() OVER (PARTITION BY buyerid, sellerid ORDER BY qty DESC) AS rnk FROM winsales ORDER BY rnk; +---------+----------+-----+---------+-------+-----+ | salesid | sellerid | qty | buyerid | d_rnk | rnk | +---------+----------+-----+---------+-------+-----+ | 20001 | 2 | 20 | b | 1 | 1 | | 30007 | 3 | 30 | c | 1 | 1 | | 10006 | 1 | 10 | c | 1 | 1 | | 10005 | 1 | 30 | a | 1 | 1 | | 20002 | 2 | 20 | c | 1 | 1 | | 30009 | 3 | 20 | b | 1 | 1 | | 40001 | 4 | 40 | a | 1 | 1 | | 30004 | 3 | 20 | b | 1 | 1 | | 10001 | 1 | 10 | c | 1 | 1 | | 40005 | 4 | 10 | a | 2 | 2 | | 30003 | 3 | 15 | b | 2 | 3 | | 30001 | 3 | 10 | b | 3 | 4 | +---------+----------+-----+---------+-------+-----+