La cláusula SQL OVER (): ¿cuándo y por qué es útil?

En palabras simples: la cláusula Over se puede utilizar para seleccionar valores no agregados junto con valores agregados.

Partition BY, ORDER BY inside y ROWS o RANGE son parte de la cláusula OVER () by.

La partición by se usa para particionar datos y luego realizar estas funciones de ventana, agregadas, y si no lo hacemos tener partición por todo el conjunto de resultados se considera como una sola partición.

Veamos la sintaxis básica de la cláusula OVER

PARTICIÓN POR: Se usa para particionar datos y realizar operaciones en grupos con los mismos datos.

ORDER BY: Se usa para definir el orden lógico de los datos en Particiones. Cuando no especificamos Partición, todo el conjunto de resultados se considera como una sola partición

: Esto se puede usar para especificar qué filas se supone que se deben considerar en una partición al realizar la operación.

Tomemos un ejemplo:

Aquí está mi conjunto de datos:

Permítanme ejecutar diferentes escenarios y ver cómo los datos se ven afectados y pasaré de una sintaxis difícil a una simple uno

Solo observe la parte sum_sal. Aquí estoy usando el orden por salario y usando «RANGE BETWEEN UNBOUNDED PRECEDING Y CURRENT ROW». En este caso, no estamos usando la partición, por lo que los datos completos se tratarán como uno partición y estamos ordenando por salario. Y lo importante aquí es FILA PRECEDENTE Y ACTUAL SIN LÍMITES. Esto significa que cuando estamos calculando la suma, desde la fila inicial hasta la fila actual para cada fila. Pero si vemos filas con salario 5000 y nombre = «Pavan», idealmente debería ser 17000 y para salario = 5000 y name = Mark, debería ser 22000. Pero como estamos usando RANGE y en este caso, si encuentra alguna s elementos similares, los considera como el mismo grupo lógico y realiza una operación sobre ellos y asigna valor a cada elemento de ese grupo. Esa es la razón por la que tenemos el mismo valor para salario = 5000. El motor subió a salario = 5000 y Name = Ron y calculó la suma y luego la asignó a todos los salarios = 5000.

Así que con FILAS ENTRE FILA PRECEDENTE Y ACTUAL SIN LÍMITES La diferencia es para elementos del mismo valor en lugar de Agrupándolos, calcula SUM desde la fila inicial hasta la fila actual y no trata los elementos con el mismo valor de manera diferente como RANGE

Estos resultados son los mismos que

Esto se debe a que Over (orden por salario) es solo un atajo de Over (orden por salario RANGO ENTRE PRECEDENTE SIN LÍMITES Y FILA ACTUAL) Entonces, dondequiera que simplemente especifiquemos Orden por sin FILAS o RANGO, se está tomando RANGE BETWEEN UNBOUNDED PRECEDING Y CURRENT ROW como predeterminado.

Nota: Esto solo se aplica a las funciones que realmente aceptan RANGE / ROW. Por ejemplo, ROW_NUMBER y algunos otros no aceptan RANGE / ROW y en ese caso , esto no entra en escena.

Hasta ahora vimos que la cláusula Over con un orden de toma Range / ROWS y la sintaxis parece algo Algo así RANGO ENTRE LA FILA PRECEDENTE Y ACTUAL SIN LÍMITES Y en realidad está calculando hasta la fila actual desde la primera fila. Pero, ¿qué pasa si quiere calcular valores para toda la partición de datos y tenerlos para cada columna (es decir, desde la primera fila hasta la última fila)? Aquí está la consulta para eso

En lugar de CURRENT ROW, estoy especificando UNBOUNDED FOLLOWING que le indica al motor que calcule hasta el último registro de partición para cada fila.

Ahora vamos a su ¿Qué es OVER () con llaves vacías?

Es solo un atajo para Over (ordenar por salario FILAS ENTRE PRECEDENTE SIN LÍMITE Y SIGUIENTE SIN LÍMITE)

Aquí estamos especificando indirectamente para tratar todo mi conjunto de resultados como una sola partición y luego realizar cálculos desde el primer registro hasta el último registro de cada partición.

Creé un video sobre esto y si está interesado, puede visitarlo. https://www.youtube.com/watch?v=CvVenuVUqto&t=1177s

Gracias, Pavan Kumar AryasomayajuluHTTP: //xyzcoder.github.io

Write a Comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *