Principales Window Function que debo tener en cuenta, como funcionan cada una y para que me van a servir.

  1. ROW_NUMBER () = Nos da el numero de la Tupla que estamos utilizando en ese momento. OVER ([PARTITION BY column] [ORDER BY column]) = Nos deja Particionar y Ordenar la Window Function. PARTITION BY (Column/s) = Es un GROUP BY para la Window Function, se coloca dentro del OVER.

  2. FIRST_VALUE (Column) = Devuelve el primer valor de una serie de Datos.

  3. LAST_VALUE (Column) = Devuelve el ultimo valor de una serie de Datos.

  4. NTH_VALUE (Column, Row_Number) = Recibe la columna y el número de Row que quiero de una serie de datos. Si no quiero ni el primero ni el ultimo valor uso NTH_VALUE.

  5. RANK () = El lugar que ocupa de acuerdo a un orden, deja gaps entre valores.

  6. DENSE_RANK () = Un rango condensado que elimina los Gaps que deja el Rank.

  7. PERCENT_RANK () = Categoriza de acuerdo a lugar que ocupa igual que los anteriores, pero por porcentajes.

ROW_NUMBER

No asignamos ninguna Partición, le colocamos un alias y añadimos el resto de los Datos de nuestra Tabla.

SELECT ROW_NUMBER() OVER() AS row_id, *
FROM platzi.alumnos;

i.png

Cuando corremos el Query justamente el row_id coincide con el id porque no nos hemos saltado ningún registro ni hemos ordenado por otro criterio ni nada.

Jugamos con la Partición para cambiar lo de arriba. Le agrego una cláusula Order By.

SELECT ROW_NUMBER() OVER(ORDER BY fecha_incorporacion) AS row_id, *
FROM platzi.alumnos;

La fecha_incorporacion ahora esta ordenada, pero el id NO, pero el Row_id sigue estando en Orden. Para esto funciona el Row_Number.

j.png

FIRST_VALUE

SELECT FIRST_VALUE(colegiatura) OVER() AS row_id, *
FROM platzi.alumnos;
  1. Si me fijo Colegiatura que es el First_value es 5000 y es justamente el que pone en row_id. Todos los Rows de la Tabla van a ser 5000 por que no particionamos, sino que es a la tabla completa.

a.png

Para cambiar el criterio y que no sea solamente la primera colegiatura, hacemos una particion en funcion de carrera_id. Ahora va a agrupar el primer registro de Colegiatura, pero solo por carrera_id.

SELECT FIRST_VALUE(colegiatura) OVER(PARTITION BY carrera_id) AS primera_colegiatura, *
FROM platzi.alumnos;
  1. Particiona la Tabla en Función de la carrera_id.
  2. Trae el primer valor de cada Partición y ese valor se lo asigna a todos los Rows de esa Particion.
  3. Pero el primer valor según el orden que estableció al azar el Query.

LAST_VALUE

SELECT LAST_VALUE(colegiatura) OVER(PARTITION BY carrera_id) AS ultima_colegiatura, *
FROM platzi.alumnos;
  1. Igual que en first_value, Particiona la Tabla en Función de la carrera_id.
  2. Trae el ultimo valor de cada Partición y ese valor se lo asigna a todos los Rows de esa Partición.
  3. Los valores los trae en el mismo orden que en First_value que es como al azar sin orden de ningún tipo.

NTH_VALUE