logo

Funciones de ventana en SQL

Las funciones de ventana se aplican para agregar y clasificar funciones en una ventana particular (conjunto de filas). La cláusula OVER se utiliza con funciones de ventana para definir esa ventana. La cláusula OVER hace dos cosas:

  • Divide filas para formar un conjunto de filas. (Se utiliza la cláusula PARTITION BY)
  • Ordena las filas dentro de esas particiones en un orden particular. (Se utiliza la cláusula ORDER BY)

Nota: Si no se realizan las particiones, ORDER BY ordena todas las filas de la tabla.

Sintaxis:



SELECT coulmn_name1,   window_function(cloumn_name2)  OVER([PARTITION BY column_name1] [ORDER BY column_name3]) AS new_column FROM table_name;       window_function=   any aggregate or ranking function    column_name1  = column to be selected   coulmn_name2=   column on which window function is to be applied   column_name3  = column on whose basis partition of rows is to be done   new_column=   Name of new column   table_name=   Name of table>

Función de ventana agregada
Varias funciones agregadas como SUM(), COUNT(), AVERAGE(), MAX() y MIN() aplicadas sobre una ventana particular (conjunto de filas) se denominan funciones de ventana agregadas.

Considera lo siguiente empleado mesa :

Nombre Edad Departamento Salario
Ramesh 20 Finanzas 50, 000
Profundo 25 Ventas 30, 000
suresh 22 Finanzas 50000
RAM 28 Finanzas 20, 000
Pradeep 22 Ventas 20, 000

Ejemplo -
Encuentre el salario promedio de los empleados para cada departamento y ordene los empleados dentro de un departamento por edad.

SELECT Name, Age, Department, Salary,   AVG(Salary) OVER( PARTITION BY Department) AS Avg_Salary  FROM employee>

Esto genera lo siguiente:

Nombre Edad Departamento Salario Salario_promedio
Ramesh 20 Finanzas 50,000 40,000
suresh 22 Finanzas 50,000 40,000
RAM 28 Finanzas 20,000 40,000
Profundo 25 Ventas 30,000 25,000
Pradeep 22 Ventas 20,000 25,000

Observe cómo todos los salarios promedio en una ventana particular tienen el mismo valor.

Consideremos otro caso:

SELECT Name, Age, Department, Salary,   AVG(Salary) OVER( PARTITION BY Department ORDER BY Age) AS Avg_Salary  FROM employee>

Aquí también ordenamos los registros dentro de la partición según los valores de edad y, por lo tanto, los valores promedio cambian según el orden de clasificación.
El resultado de la consulta anterior será:

Nombre Edad Departamento Salario Salario_promedio
Ramesh 20 Finanzas 50,000 50,000
suresh 22 Finanzas 50,000 50,000
RAM 28 Finanzas 20,000 40,000
Pradeep 22 Ventas 20,000 20,000
Profundo 25 Ventas 30,000 25,000

Por lo tanto, debemos tener cuidado al agregar cláusulas order by a funciones de ventana con agregados.

programas c

Funciones de la ventana de clasificación:
Las funciones de clasificación son RANK(), DENSE_RANK(), ROW_NUMBER()

  • RANGO() –
    Como sugiere el nombre, la función de clasificación asigna una clasificación a todas las filas dentro de cada partición. El rango se asigna de manera que al rango 1 otorgado a la primera fila y a las filas que tienen el mismo valor se les asigna el mismo rango. Para la siguiente clasificación después de dos valores de clasificación iguales, se omitirá un valor de clasificación. Por ejemplo, si dos filas comparten el rango 1, la siguiente fila obtiene el rango 3, no el 2.
  • RANGO_DENSO() –
    Asigna rango a cada fila dentro de la partición. Al igual que a la función de clasificación, a la primera fila se le asigna el rango 1 y las filas que tienen el mismo valor tienen el mismo rango. La diferencia entre RANK() y DENSE_RANK() es que en DENSE_RANK(), para el siguiente rango después de dos mismos rangos, se utiliza un número entero consecutivo y no se omite ningún rango.
  • NUMERO DE FILA() -
    ROW_NUMBER() le da a cada fila un número único. Numera las filas desde uno hasta el total de filas. Las filas se agrupan según sus valores. Cada grupo se llama partición. En cada partición, las filas obtienen números uno tras otro. No hay dos filas que tengan el mismo número en una partición. Esto hace que ROW_NUMBER() sea diferente de RANK() y DENSE_RANK(). ROW_NUMBER() identifica de forma única cada fila con un número entero secuencial. Esto ayuda con diferentes tipos de análisis de datos.

Nota -
ORDER BY() debe especificarse obligatoriamente al utilizar funciones de ventana de clasificación.

Ejemplo -
Calcule el número de fila, el rango, el rango denso de los empleados en la tabla de empleados según el salario dentro de cada departamento.

SELECT   ROW_NUMBER() OVER (PARTITION BY Department ORDER BY Salary DESC) AS emp_row_no,   Name,   Department,   Salary,  RANK() OVER(PARTITION BY Department ORDER BY Salary DESC) AS emp_rank,  DENSE_RANK() OVER(PARTITION BY Department ORDER BY Salary DESC) AS emp_dense_rank FROM   employee;>

El resultado de la consulta anterior será:

emp_row_no Nombre Departamento Salario emp_rank emp_dense_rank
1 Ramesh Finanzas 50, 000 1 1
2 suresh Finanzas 50, 000 1 1
3 RAM Finanzas 20, 000 3 2
1 Profundo Ventas 30, 000 1 1
2 Pradeep Ventas 20, 000 2 2

Entonces, podemos ver que, como se menciona en la definición de ROW_NUMBER(), los números de fila son enteros consecutivos dentro de cada partición. Además, podemos ver la diferencia entre el rango y el rango denso: en el rango denso no hay una brecha entre los valores de la clasificación, mientras que hay una brecha en los valores de la clasificación después de una clasificación repetida.