sql >> Base de Datos >  >> RDS >> Oracle

Tratando de entender over() y partición por

Intente ordenar por fecha de pedido, verá los resultados más fácilmente

select Row_Number() over(partition by orderdate order by orderdate asc) 
    as Rownumber, salesorderid, orderdate
from test2
order by orderdate;

debería dar (agregué líneas en blanco para mayor claridad)

ROWNUMBER     SALESORDERID       ORDERDATE
1             43664              07/01/2001

1             43911              08/01/2001
2             43867              08/01/2001
3             43895              08/01/2001
4             43894              08/01/2001
5             43877              08/01/2001

1             44109              09/01/2001

1             44285              10/01/2001

1             44483              11/01/2001
2             44501              11/01/2001

Notará que el resultado se divide en 'particiones', siendo cada partición el conjunto de filas con fechas de pedido idénticas. Eso es lo que significa 'particionar por fecha de pedido'.

Dentro de una partición, las filas se ordenan por fecha de pedido, según la segunda cláusula de '(partition by orderdate order by orderdate asc)'. Eso no es muy útil, ya que todas las filas dentro de una partición tendrán la misma fecha de pedido. Por eso, el orden de las filas dentro de una partición es aleatorio. Intente ordenar por salesorderid dentro de la cláusula de partición para tener un resultado más reproducible.

row_number() solo devuelve el orden de las filas dentro de cada partición