Criterio ROWS y RANGE
Parte de la sección Fundamentos del Journey de SQL de Coddy. Lección 69 de 72.
Hasta ahora, no podemos ser flexibles al elegir cuántas filas anteriores o posteriores tener en cuenta. Ahora es posible con los criterios ROWS y RANGE. Para usarlos, escribimos:
OVER (ROWS BETWEEN --START-- AND --END--)
OVER (RANGE BETWEEN --START-- AND --END--)
Y podemos especificar las siguientes opciones:
CURRENT ROW- la fila actualn PRECEDING- filas antes de la fila actualn FOLLOWING- filas después de la fila actual
La diferencia entre ROWS y RANGE es que el criterio ROWS no tiene en cuenta los valores, solo las posiciones, mientras que RANGE define la ventana en términos de rangos de valores en lugar de posiciones de filas.
Para RANGE debemos especificar ORDER BY --column_name-- porque, de lo contrario, no sabría cómo elegir la ventana.
Por ejemplo:
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWINGAquí crea una ventana que incluye la fila actual, la fila anterior y la fila siguiente.
RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING ORDER BY levelsAquí crea una ventana que incluye, para cada nivel (ordenado en orden ascendente), el nivel actual, un nivel anterior y un nivel posterior. Si el nivel actual es 5, incluirá los niveles 4, 5 y 6.
Nota: El uso de RANGE BETWEEN podría incluir más filas en tu ventana, porque incluye todas las filas que comparten los mismos valores que los del rango, mientras que ROWS BETWEEN siempre incluirá el mismo número de filas (siempre que estén disponibles en el conjunto de datos).
Además, RANGE no admite columnas de fecha.
Aquí tienes un ejemplo sencillo para ilustrar ROWS frente a RANGE:
Uso de ROWS:
SELECT employee_name, salary,
AVG(salary) OVER (
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
) as avg_salary_rowsUso de RANGE:
SELECT employee_name, salary,
AVG(salary) OVER (
ORDER BY salary
RANGE BETWEEN 1000 PRECEDING AND 1000 FOLLOWING
) as avg_salary_rangeDesafío
FácilTablas y columnas disponibles:
newspapers:date,num_newspapers
Para este desafío, tenemos periódicos para la producción. Nos gustaría saber el promedio de periódicos que se imprimieron dos días antes de la fila actual y un día después. Además, nos gustaría conocer la diferencia entre el número máximo y mínimo de periódicos impresos desde la fecha actual y los tres días anteriores a ella. Llama a estas columnas avg_newspapers y diff_newspapers, respectivamente.
Pruébalo tú mismo
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Fundamentos
4Más palabras clave
La palabra clave INLa palabra clave BETWEENLa palabra clave LIKELa palabra clave ASRepaso: modelos de celulares2Condiciones
Conceptos básicos de las condicionesLa palabra clave ANDLa palabra clave ORLa palabra clave NOTCombinación de múltiples condicionesParéntesisBooleanos5Operaciones aritméticas
Operadores matemáticosColumnas matemáticasLa operación móduloLa función ROUND()3Formato de retorno específico
Valores nulosOrdenar resultados, parte 1Ordenar resultados, parte 2Repaso: empresa de ciberseguridadLimitar el número de registrosRepaso: fábrica de vehículos6Desafíos introductorios
Repaso - Elección parlamentariaRepaso - Detención policial de un criminalRepaso - Recipiente de bebida de barRepaso - Ingeniería de nuevas columnas9Múltiples tablas
Unión básica, parte 1Unión básica, parte 2Repaso: uniónAutouniónRepaso: autouniónUniónSimplificar consultas, palabra clave WITHRepaso: consultas WITHRepaso: contratista inmobiliario12Funciones de ventana, parte 2
Funciones RANK y DENSE_RANKRepaso: RANK y DENSE_RANKFunción NTILEFunciones de agregaciónCriterio ROWS y RANGEPractica por tu cuenta: Playground de SQL