tipos tablas tabla particiones particionamiento particion existente datos crear sql oracle

sql - tablas - tipos de particiones en base de datos



Tratando de entender sobre() y particionar por (2)

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;

debe dar (he añadido 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'', cada partición es el conjunto de filas con fechas de pedido idénticas. Eso es lo que significa ''partición por fecha de pedido''.

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

row_number () simplemente devuelve el orden de la fila dentro de cada partición

Estoy tratando de terminar y particionar por la funcionalidad envuelta alrededor de mi cabeza. Aquí hay un ejemplo que simplemente no entiendo.

Aquí están los datos que tengo:

SALESORDERID ORDERDATE 43894 08/01/2001 43664 07/01/2001 43911 08/01/2001 43867 08/01/2001 43877 08/01/2001 44285 10/01/2001 44501 11/01/2001 43866 08/01/2001 43895 08/01/2001 43860 08/01/2001

Cuando ejecuto esta consulta:

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

Aquí están los resultados que obtengo:

ROWNUMBER SALESORDERID ORDERDATE 1 43664 07/01/2001 1 43911 08/01/2001 1 44109 09/01/2001 1 44483 11/01/2001 1 44285 10/01/2001 2 43867 08/01/2001 2 44501 11/01/2001 3 43895 08/01/2001 4 43894 08/01/2001 5 43877 08/01/2001

Alguien me puede explicar esta consulta. No soy nuevo en SQL, pero he estado teniendo problemas con las ventanas y no puedo entenderlo.


La partition by orderdate significa que solo está comparando registros con otros registros con el mismo orderdate . Por ejemplo, de los cinco registros con fecha de orderdate = ''08/01/2001'' , uno tendrá número de row_number() = 1 , uno tendrá número de row_number() = 2 , y así sucesivamente.

El order by orderdate asc significa que, dentro de una partición, los números de fila deben asignarse en orden de orderdate . En su ejemplo, eso no tiene ningún efecto, porque ya está particionando por orderdate , por lo que todos los registros dentro de una partición tendrán la misma fecha de orderdate . (Sería como escribir SELECT ... FROM t WHERE c = 6 ORDER BY c : todos los registros seleccionados tienen el mismo valor de c , por lo que ORDER BY c no hace nada). Entonces, dentro de una partición, la asignación de row_number() es arbitrario: cada fila tendrá un número diferente, pero no hay garantías sobre qué fila tendrá qué número.