Funciones de ventana: la parte de SQL que mira otras filas sin colapsarlas
OVER(), PARTITION BY y ORDER BY permiten calcular medias, rangos y acumulados manteniendo cada fila individual en el resultado, algo que GROUP BY no puede hacer.

GROUP BY resuelve media pregunta. Cuando pides la media salarial por departamento, devuelve una fila por departamento y los empleados desaparecen del resultado. Las funciones de ventana cubren el otro caso: calculan un agregado sobre un conjunto de filas sin colapsarlas, así que cada fila original sigue en la respuesta con el dato de su grupo al lado.
El ejemplo de manual: cuatro empleados, Amina y Brian en Data con 80000 y 100000, Carol y David en HR con 70000 y 90000. Un GROUP BY por departamento deja dos filas, 90000 y 80000, y por el camino se ha perdido quién cobra qué. Con AVG(salary) OVER() la media se calcula sobre todas las filas disponibles y se repite en cada una: 85000 en las cuatro.
OVER, PARTITION BY, ORDER BY
OVER() es el contenedor de todo lo demás. Le dice al motor que haga el cálculo sobre un conjunto de filas sin fundirlas en una sola.
PARTITION BY department mete el corte por grupo: ahora la media es 90000 para Data y 80000 para HR, y las cuatro filas siguen ahí. Es la diferencia de fondo con GROUP BY, que agrupa y colapsa; PARTITION BY agrupa solo para el cálculo y devuelve el resultado junto a cada fila que lo alimentó.
ORDER BY dentro de OVER() responde a otra pregunta: en qué orden se le presentan las filas a la función. Sin él, una suma acumulada no significa nada.
Tres formas de numerar
Con Amina y Brian empatados a 100000, Carol con 80000 y David con 70000:
ROW_NUMBER() asigna una posición única a cada fila, del 1 al 4, dé igual que dos sueldos coincidan. RANK() da el mismo número a los empatados, 1 y 1, y se salta el 2: el siguiente es el 3. DENSE_RANK() también reparte el empate, pero sin dejar huecos en la secuencia. Elegir mal entre los tres es la fuente habitual de duplicados y de filas que se pierden al paginar resultados.
Lo que queda por ver es el marco de la ventana. En cuanto hay un ORDER BY, entran en juego los acumulados —ventas del mes hasta la fecha, comparación con el día anterior—, y ahí hay que decir explícitamente qué filas entran en cada cálculo. Es el siguiente escalón después de entender OVER().

