Volver a la lista de artículos Artículos
Lectura de 5 minutos

Ejemplo de función de ventana SQL con explicaciones

¿Le interesa saber cómo funcionan las funciones de ventana? Desplácese hacia abajo para ver nuestro ejemplo de función de ventana SQL con explicaciones definitivas.

Las funciones ventana deSQL son un poco diferentes; calculan su resultado basándose en un conjunto de filas en lugar de una sola fila. De hecho, la "ventana" en "función ventana" se refiere a ese conjunto de filas.

Las funciones ventana son similares a las funciones agregadas, pero hay una diferencia importante. Cuando utilizamos funciones agregadas con la cláusula GROUP BY perdemos las filas individuales. No podemos mezclar los atributos de una fila individual con los resultados de una función agregada; la función se realiza sobre las filas como un grupo completo. Este no es el caso cuando utilizamos funciones de ventana SQL: podemos generar un conjunto de resultados con algunos atributos de una fila individual junto con los resultados de la función ventana. Esto es bueno para que los nuevos desarrolladores de SQL lo tengan en cuenta. Así que examinemos un simple ejemplo de función de ventana SQL en acción.

¿Quieres aprender las funciones de ventana SQL? Vea nuestro curso interactivo Funciones de ventana interactivo.

Ejemplo de Función de Ventana SQL

Las funciones ventana pueden ser llamadas en la sentencia SELECT o en la cláusula ORDER BY cláusula. Sin embargo, nunca pueden ser llamadas en la cláusula WHERE cláusula. Observará que todos los ejemplos de este artículo llaman a la función de ventana en la SELECT lista de columnas.

Vayamos al primer ejemplo de función ventana SQL. Utilizaremos la cláusula "Employee" de la tabla:

employee_id full_name department salary
100 Mary Johns SALES 1000.00
101 Sean Moldy IT 1500.00
102 Peter Dugan SALES 2000.00
103 Lilian Penn SALES 1700.00
104 Milton Kowarsky IT 1800.00
105 Mareen Bisset ACCOUNTS 1200.00
106 Airton Graue ACCOUNTS 1100.00

Comenzaremos con RANKque es una de las funciones de ventana SQL más sencillas del ejemplo. Devuelve la posición de cualquier fila dentro de la partición. Vamos a utilizarla para clasificar los salarios dentro de los departamentos:

SELECT	
		RANK() OVER (PARTITION BY department ORDER BY salary DESC) 
			AS dept_ranking,
		department,
		employee_id, 
		full_name, 
		salary
FROM employee;

Podemos ver los resultados a continuación:

¿Y si queremos tener el mismo informe pero con todos los empleados de mayor rango primero, luego todos los de segundo rango, y así sucesivamente? Bueno, te proponemos este reto para que lo resuelvas por ti mismo. Comparte tus ideas en la sección de comentarios.

Siguiendo con nuestro ejemplo de función de ventana SQL, averigüemos en qué posición se encuentra el salario de cada empleado en relación con el salario más alto de su departamento. Esto requiere una expresión matemática, como

salario_del_empleado / salario_máximo_en_profundidad

La siguiente consulta mostrará todos los empleados ordenados por la métrica anterior; los empleados con el salario más bajo (en relación con el salario más alto de su departamento) aparecerán en primer lugar:

SELECT
  employee_id, 
  full_name, 
  department,
  salary,
  salary / MAX(salary) OVER (PARTITION BY department ORDER BY salary DESC) 
    AS salary_metric
FROM employee
ORDER BY 5;

¿Interesado en aprender las funciones de ventana de SQL? Pruebe nuestro curso interactivo Funciones de ventana interactivo.

Otro ejemplo de función de ventana SQL

Pasemos de una base de datos de sueldos de empleados a la siguiente base de datos de horarios de trenes:

Train_id Station Time
110 San Francisco 10:00:00
110 Redwood City 10:54:00
110 Palo Alto 11:02:00
110 San Jose 12:35:00
120 San Francisco 11:00:00
120 Redwood City Non Stop
120 Palo Alto 12:49:00
120 San Jose 13:30:00

Supongamos que queremos añadir una nueva columna llamada "tiempo hasta la siguiente estación". Para obtener este valor, restamos los tiempos de las estaciones para los pares de estaciones contiguas. Podemos calcular este valor sin usar una función de ventana SQL, pero eso puede ser muy complicado. Es más sencillo hacerlo utilizando la función LEAD de la función de ventana. Esta función compara los valores de una fila con la siguiente para obtener un resultado. En este caso, compara los valores de la fila "tiempo" de una estación con la estación inmediatamente posterior.

Así que aquí tenemos otro ejemplo de función de ventana SQL, esta vez para el horario de trenes:

SELECT 
	train_id, 
	station,
	time as "station_time",
	lead(time) OVER (PARTITION BY train_id ORDER BY time) - time 
		AS time_to_next_station
FROM train_schedule;

Obsérvese que calculamos la función LEAD función ventana utilizando una expresión que implica una columna individual y una función ventana; esto no es posible con las funciones agregadas.

Aquí están los resultados de esa consulta:

En el siguiente ejemplo, añadiremos una nueva columna que muestra el tiempo transcurrido desde la primera parada del tren hasta la estación actual. La llamaremos "tiempo de viaje transcurrido". La función de ventana MIN obtendrá la hora de inicio del viaje y le restaremos la hora de la estación actual. Aquí está el siguiente ejemplo de función de ventana SQL

SELECT 	
	train_id, 
	station,
	time as "station_time",
	time - min(time) OVER (PARTITION BY train_id ORDER BY time) 	
								AS elapsed_travel_time,
	lead(time) OVER (PARTITION BY train_id ORDER BY time) - time 
								AS time_to_next_station
FROM train_schedule;

Observe la nueva columna en la tabla de resultados:

Descubra más ejemplos de funciones de ventana SQL

Las funciones de ventana no son aspectos muy conocidos de SQL, pero su potencia y flexibilidad las hacen muy importantes. Hay cláusulas (por ejemplo PARTITION BY y marco de ventana) y temas que no cubrimos en este artículo, ¡pero no dejes que eso te detenga! Puedes aprender más y encontrar otros ejemplos de funciones de ventana SQL usando nuestro blog y el Funciones de ventana curso en LearnSQL.es. ¡Empieza hoy mismo!