Solo verá la diferencia si tiene vínculos dentro de una partición para un valor de pedido particular.
RANK
y DENSE_RANK
son deterministas en este caso, todas las filas con el mismo valor tanto para las columnas de ordenación como de partición terminarán con un resultado igual, mientras que ROW_NUMBER
asignarán arbitrariamente (no determinísticamente) un resultado incremental a las filas vinculadas.
Ejemplo: (Todas las filas tienen lo mismo, StyleID
por lo que están en la misma partición y dentro de esa partición las primeras 3 filas están vinculadas cuando se ordena por ID
)
WITH T(StyleID, ID)
AS (SELECT 1,1 UNION ALL
SELECT 1,1 UNION ALL
SELECT 1,1 UNION ALL
SELECT 1,2)
SELECT *,
RANK() OVER(PARTITION BY StyleID ORDER BY ID) AS 'RANK',
ROW_NUMBER() OVER(PARTITION BY StyleID ORDER BY ID) AS 'ROW_NUMBER',
DENSE_RANK() OVER(PARTITION BY StyleID ORDER BY ID) AS 'DENSE_RANK'
FROM T
Devoluciones
StyleID ID RANK ROW_NUMBER DENSE_RANK
----------- -------- --------- --------------- ----------
1 1 1 1 1
1 1 1 2 1
1 1 1 3 1
1 2 4 4 2
Puede ver que para las tres filas idénticas los ROW_NUMBER
incrementos, el RANK
valor permanece igual y luego salta a 4
. DENSE_RANK
también asigna el mismo rango a las tres filas, pero luego al siguiente valor distinto se le asigna un valor de 2.
Este artículo cubre una relación interesante entre
ROW_NUMBER()
yDENSE_RANK()
(laRANK()
función no se trata específicamente). Cuando necesite un generadoROW_NUMBER()
en unaSELECT DISTINCT
declaración,ROW_NUMBER()
producirá valores distintos antes de que laDISTINCT
palabra clave los elimine . Por ejemplo, esta consulta... podría producir este resultado (
DISTINCT
no tiene efecto):Mientras que esta consulta:
... produce lo que probablemente quieras en este caso:
Tenga en cuenta que la
ORDER BY
cláusula de laDENSE_RANK()
función necesitará todas las demás columnas de laSELECT DISTINCT
cláusula para funcionar correctamente.La razón de esto es que, lógicamente, las funciones de la ventana se calculan antes de
DISTINCT
aplicarse .Las tres funciones en comparación
Usando la sintaxis estándar de PostgreSQL / Sybase / SQL (
WINDOW
cláusula):... obtendrás:
fuente
Bastante:
El rango de una fila es uno más el número de rangos que vienen antes de la fila en cuestión.
Row_number es el rango distintivo de filas, sin ninguna brecha en la clasificación.
http://www.bidn.com/blogs/marcoadf/bidn-blog/379/ranking-functions-row_number-vs-rank-vs-dense_rank-vs-ntile
fuente
Consulta simple sin cláusula de partición:
Salida:
fuente
Mira este ejemplo.
Insertar algunos datos
Repita los mismos valores para 1
Mira todo
Mira tus resultados
Necesito entender lo diferente
fuente
Además, preste atención a ORDER BY en PARTITION (se utiliza Standard AdventureWorks db, por ejemplo) cuando use RANK.
Da resultado:
SalesOrderID SalesOrderDetailID rank_same_as_partition rank_salesorderdetailid43659 1 1 1
43659 2 1 2
43659 3 1 3
43659 4 1 4
43659 5 1 5
43659 6 1 6
43659 7 1 7
43659 8 1 8
43659 9 1 9
43659 10 1 10
43659 11 1 11
43659 12 1 1 12
Pero si cambia el orden por a (use OrderQty:
Da:
SalesOrderID OrderQty rank_salesorderid rank_orderqty43659 1 1 1
43659 1 1 1
43659 1 1 1
43659 1 1 1
43659 1 1 1
43659 1 1 1
43659 2 1 7
43659 2 1 7
43659 3 1 9
43659 3 1 9
43659 4 1 11
43659 6 1 12
Observe cómo cambia el Rango cuando usamos OrderQty (segunda columna de la derecha) en ORDER BY y cómo cambia cuando usamos SalesOrderDetailID (primera columna de la derecha) en ORDER BY.
fuente
No he hecho nada con el rango, pero descubrí esto hoy con row_number ().
Esto dará como resultado algunos números de fila repetidos ya que en mi caso cada nombre contiene todos los elementos. Cada artículo será ordenado por cuántos se vendieron.
fuente