sábado, 1 de junio de 2013

SQL. Función Row_Number

Esta función permite obtener el ranking de posición de cada uno  de los registros de la sentencia SQL según la clasificación y ordenación que deseemos.


Número de fila de resultado


Con la estructura de de la función en su forma row_number() podremos obtener el número de fila en los resultados de la ejecución de SQL según la ordenación y selección de la sentencia.

Ejemplo:  Sentencia simple
SELECT IdCliente, IdPais, IdTipCli, row_number() over() as Orden,  Nombre, Apellidos FROM Cliente;                            


  



Ejemplo: Sentencia simple con una ordenación
SELECT IdCliente, IdPais, IdTipCli, row_number() over() as Orden,  Nombre, Apellidos FROM Clienteorder by apellidos, nombre





Over Partición

Con esta funcionalidad permite calcular la secuencia en base a clasificaciones por n campos. El formato es row_number() over(partition by campo1, campo2..).

Tendrá secuencias diferentes para todas las combinaciones de campo1, campo2, etc. Imaginemos que se hace la partición por código de país, entonces habrá una secuencia 1, 2, 3, 4, para el país X, otra secuencia 1, 2, 3, 4 ... para el país Y y así sucesivamente para cada unos de los países que tenga el fichero.

Ejemplo: Sentencia simple con una ordenación y calculo de número de fila en base a una clasificación (en este caso por IdPais)
SELECT IdCliente, IdPais, IdTipCli, 
row_number() over(partition by idpais) as Orden,  
Nombre, Apellidos FROM Cliente order by apellidos, nombre;    





Over Order 

Con esta funcionalidad permite calcular la secuencia en base a la ordenación que se le indica. El formato es row_number() over(order by campo1, campo2..).

Generará la secuencia 1,2,3,4 según el orden de campos indicado (independientemente del order by que tuviera la sentencia SQL) 

Ejemplo: Sentencia con una ordenación y calculo la secuencia base a una clasificación (en este caso por IdPais) y en base a la ordenación que se propone (apellidos y nombre)
SELECT IdCliente, IdPais, IdTipCli, 
row_number() over(partition by idpais order by apellidos, nombre) as Orden, Nombre, Apellidos FROM Cliente order by apellidos, nombre   




Ejemplo: Sentencia con una ordenación y calculo de número de fila en base a una clasificación (en este caso por IdPais y IdTipCli) y en base a la ordenación que se propone de los mismos campos
SELECT IdCliente, IdPais, IdTipCli, 
row_number() over(partition by idpais, IdTipCLi order by idpais, IdTipCLi) as OrdenNombre, Apellidos FROM Cliente



3 comentarios:

  1. Tengo un problema con esto, no puedo hacer UPPER si uso el RowNumber.. tengo entendido que una funcion OLAP no esta permitida usarla con una funcion UPPER, alguna solucion alternativa?

    ResponderEliminar
    Respuestas
    1. Hola
      ¿has probado a utilizar en la misma sql una tabla temporal con la realización previa del UPPER y posteriormente el RowNumber? (esta semana yo no lo puedo probar pero lo intentaré la semana que viene)

      Eliminar
    2. Gerardo, ¿qué es lo necesitas realmente? He probado a incluir la opción Upper sobre las condiciones en RowNumber. Por ejemplo, funciona lo siguiente:
      SELECT IdCliente, IdPais, IdTipCli,
      row_number() over(partition by Lower(idpais)) as Orden,
      Nombre, Apellidos FROM Cliente order by apellidos, nombre

      Eliminar