Es lo que más voy a escuchar sobre todo en Analítica y Ciencia de Datos. Es una herramienta muy poderosa en DB Relacionales sobre todo en Postgre.

Es la relación entre un Row y el resto de Rows en una partición o window frame.

Window Frame = Una sección de la Tabla que me interesa medir y saber cuál es la relación que existe entre uno de los Rows y todo el resto de los Rows que se encuentran en la partición.

Las Window Function corren al final de casi todo, corren después de WHERE, HAVING, menos por ORDER BY.

EJEMPLO: Podemos medir según algún criterio:

  1. Cuál es el Row #1, el 2do el 3er etc.
  2. De los Rows cuál es el promedio.
  3. Cuál es la suma de uno tras el otro tras el otro etc.

PARA QUE SIRVEN:

  1. Nos ahorra hacer muchos Egoísta (Selfish) Selfs Joins (Hacer una Tabla unida consigo misma).
  2. Para hacer los anteriores ejemplos tendríamos que unir la Tabla consigo misma varias veces, entonces se vuelve muy complejo y tener poder de procesamiento muy grande. La Window Function me ayuda a resolver este problema.

EJEMPLO 1

SELECT *,
		AVG(colegiatura) OVER (PARTITION BY carrera_id)
FROM platzi.alumnos;
  1. Hago un SELECT de todos los campos.
  2. Le agrego el Promedio de la Colegiatura que es la Window Function.
  3. Y el OVER me dice sobre qué voy a hacer la Window Function. Le digo que la haga sobre una Partición del campo Carrera_id.

1.png

2.png

3.png

D. Luego especifico de donde se sacarán los Datos.

E. Obtenemos la Colegiatura Promedio por Carrera, para todos los carrera_id 1 será el mismo, para carrera_id 2 será distinto, carrera_id 3 distinto, y así con todas las carreras.

EJEMPLO 2

¿Cuándo No le determino una partición que sucede? Toma como Partición o Window Frame toda la tabla. Para este ejemplo sacaría el promedio de toda la Columna Colegiatura sin importar la carrera_id. Saca un promedio general de todo el campo.

SELECT *,
		AVG(colegiatura) OVER ()
FROM platzi.alumnos;

a.png

  1. Al no especificar la partición vemos que saca el promedio de toda la columna colegiatura en general sin importar el carrera_id.
  2. En el ejemplo 1 vemos cuando especificamos la partición, viene implícito que lo ordena ASC por carrera_id, caso contrario acá que deja la tabla con el orden original.

EJEMPLO 3

Qué pasa si en lugar de hacer una Partición, coloco un Order By dentro de la Window Function?

SELECT *,
		SUM(colegiatura) OVER (ORDER BY colegiatura)
FROM platzi.alumnos;

b.png

c.png

d.png

e.png

EJEMPLO 3.1

Agrego al ejemplo 3, una Partición para que no sea de toda la Tabla sino por carrera_id

SELECT *,
		SUM(colegiatura) OVER (PARTITION BY carrera_id ORDER BY colegiatura)
FROM platzi.alumnos;

f.png

Algunas funciones no necesitan OVER, pero otras si, como ROW_NUMBER, que la vimos anteriormente, y una función más, llamada RANK, que actúa como ROW_NUMBER, pero toma en cuenta los valores repetidos

RANKING

Qué lugar ocupa algo en nuestra Tabla.

Si queremos hacer cosas más interesantes con RANK lo veremos en la siguiente clase Particiones y Agregaciones

EJEMPLO 1

SELECT *,
		RANK() OVER (PARTITION BY carrera_id ORDER BY colegiatura DESC)
FROM platzi.alumnos;

g.png

EJEMPLO 1.1

Le asignamos un Alias y ordenamos primero por carrera_id y luego por la Window Function.