Función de ventana ROW_NUMBER
Asigna un número ordinal de la fila actual en un grupo de filas, contando desde 1, según la expresión ORDER BY en la cláusula OVER. Si hay una cláusula opcional PARTITION BY, los números ordinales se restablecen para cada grupo de filas. Las filas con valores iguales para las expresiones ORDER BY reciben los diferentes números de fila de manera no determinística.
Sintaxis
ROW_NUMBER() 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
-
La cláusula de la función de ventana para la función ROW_NUMBER.
- PARTITION BY expr_list
-
Opcional. Una o varias expresiones de columna que dividen los resultados en conjuntos de filas.
- ORDER BY order_list
-
Opcional. Una o más expresiones de columna que definen el orden de las filas de un conjunto. Si no se especifica PARTITION BY, ORDER BY utiliza toda la tabla.
Si ORDER BY no produce una ordenación única o se omite, 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
BIGINT
Ejemplos
En los siguientes ejemplos se usa la tabla WINSALES
. Para ver una descripción de la tabla WINSALES
, consulte Tabla de muestra para ejemplos de funciones de ventana.
En el siguiente ejemplo se ordena la tabla por QTY (en orden ascendente) y, a continuación, se asigna un número de fila 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, ROW_NUMBER() OVER( ORDER BY qty ASC) AS row FROM winsales ORDER BY 4,1;
salesid sellerid qty row ---------+----------+-----+----- 30001 | 3 | 10 | 1 10001 | 1 | 10 | 2 10006 | 1 | 10 | 3 40005 | 4 | 10 | 4 30003 | 3 | 15 | 5 20001 | 2 | 20 | 6 20002 | 2 | 20 | 7 30004 | 3 | 20 | 8 10005 | 1 | 30 | 9 30007 | 3 | 30 | 10 40001 | 4 | 40 | 11
En el siguiente ejemplo, se particiona la tabla según SELLERID y se ordena cada partición según QTY (en orden ascendiente); luego, se asigna un número 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, ROW_NUMBER() OVER( PARTITION BY sellerid ORDER BY qty ASC) AS row_by_seller FROM winsales ORDER BY 2,4;
salesid | sellerid | qty | row_by_seller ---------+----------+-----+----- 10001 | 1 | 10 | 1 10006 | 1 | 10 | 2 10005 | 1 | 30 | 3 20001 | 2 | 20 | 1 20002 | 2 | 20 | 2 30001 | 3 | 10 | 1 30003 | 3 | 15 | 2 30004 | 3 | 20 | 3 30007 | 3 | 30 | 4 40005 | 4 | 10 | 1 40001 | 4 | 40 | 2
En el siguiente ejemplo se muestran los resultados cuando no se utilizan las cláusulas opcionales.
SELECT salesid, sellerid, qty, ROW_NUMBER() OVER() AS row FROM winsales ORDER BY 4,1;
salesid sellerid qty row ---------+----------+-----+----- 30001 | 3 | 10 | 1 10001 | 1 | 10 | 2 10005 | 1 | 30 | 3 40001 | 4 | 40 | 4 10006 | 1 | 10 | 5 20001 | 2 | 20 | 6 40005 | 4 | 10 | 7 20002 | 2 | 20 | 8 30003 | 3 | 15 | 9 30004 | 3 | 20 | 10 30007 | 3 | 30 | 11