2012-02-16 7 views
20

Estoy tratando de obtener el más y la partición por la funcionalidad envuelto alrededor de mi cabeza. Aquí hay un ejemplo que simplemente no entiendo.Tratando de entender sobre() y la partición por

Estos son 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 ejecuta esta consulta:

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

Éstos son 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 

¿Puede alguien explicar esta consulta a mi. No soy nuevo en SQL, pero he estado luchando con ventanas y no puedo entender esto.

Respuesta

26

trate de 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; 

deben 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 

Se dará cuenta de que la el resultado se divide en 'particiones', cada partición es el conjunto de filas con datos ordenados idénticos. Eso es lo que significa 'partición por orden'.

Dentro de una partición, las filas se ordenan por fecha de pedido, según la segunda cláusula de '(partición por fecha de pedido ordenada por fecha de pedido asc)'. Eso no es muy útil, ya que todas las filas dentro de una partición van a tener 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 partition by para obtener un resultado más reproducible.

row_number() sólo devuelve orden de la fila dentro de cada partición

+1

Proveedores SELECT COUNT (*) OVER (partición ....) podría ser aún más claro a lo que está haciendo . –

+0

Gracias por su respuesta. La cláusula de partición es muy poderosa – Luke101

+0

Agradable y claro gracias! –

9

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

El order by orderdate asc significa que, dentro de una partición, los números de fila se asignan 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 el mismo 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.) Por lo tanto, dentro de una partición, la asignación de row_number() es arbitraria: cada fila tendrá un número diferente, pero no hay garantías sobre qué fila tendrá qué número.

+0

Esta respuesta debería haber sido aceptado en lugar – Avi

Cuestiones relacionadas