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.