Вы увидите разницу, только если у вас есть связи внутри раздела для определенного значения заказа.
RANK
и DENSE_RANK
в этом случае являются детерминированными, все строки с одинаковым значением как для столбцов упорядочения, так и для столбцов разделения будут иметь одинаковый результат, в то время как ROW_NUMBER
произвольно (недетерминированно) назначат приращивающийся результат для связанных строк.
Пример: (Все строки имеют одинаковое значение, StyleID
поэтому находятся в одном и том же разделе, и в этом разделе первые 3 строки связаны, когда они упорядочены 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
Возвращает
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
Вы можете видеть, что для трех идентичных строк ROW_NUMBER
приращения, RANK
значение остается тем же самым , к которому оно скачет 4
. DENSE_RANK
также присваивает один и тот же ранг всем трем строкам, но затем следующему отдельному значению присваивается значение 2.
В этой статье рассматриваются интересные отношения между
ROW_NUMBER()
иDENSE_RANK()
(RANK()
функция не рассматривается конкретно). Когда вам нужно формируемыеROW_NUMBER()
наSELECT DISTINCT
заявлении,ROW_NUMBER()
будет производить различные значения , прежде чем они будут удалены поDISTINCT
ключевому слову. Например, этот запрос... может дать такой результат (не
DISTINCT
имеет никакого эффекта):Тогда как этот запрос:
... производит то, что вы, вероятно, хотите в этом случае:
Обратите внимание, что для правильной работы
ORDER BY
предложенияDENSE_RANK()
функции нужны все остальные столбцы из этогоSELECT DISTINCT
предложения.Причина этого в том, что логически оконные функции вычисляются до того, как они
DISTINCT
будут применены .Все три функции в сравнении
Использование стандартного синтаксиса PostgreSQL / Sybase / SQL (
WINDOW
предложение):... ты получишь:
источник
Немного:
Ранг строки равен одному плюс количество рангов, предшествующих данному ряду.
Row_number - это отдельный ранг строк, без каких-либо пробелов в ранжировании.
http://www.bidn.com/blogs/marcoadf/bidn-blog/379/ranking-functions-row_number-vs-rank-vs-dense_rank-vs-ntile
источник
Простой запрос без предложения раздела:
Вывод:
источник
Посмотри этот пример.
Вставьте некоторые данные
Повторите те же значения для 1
Смотреть все
Смотри свои результаты
Надо понимать разные
источник
Также обратите внимание на ORDER BY in PARTITION (например, используется стандартная база данных AdventureWorks) при использовании RANK.
Дает результат:
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 12
Но если изменить порядок на (используйте OrderQty:
дает:
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
Обратите внимание, как изменяется ранг, когда мы используем OrderQty (вторая таблица правого столбца) в ORDER BY, и как он изменяется, когда мы используем SalesOrderDetailID (первая таблица правого столбца) в ORDER BY.
источник
Я ничего не сделал с рангом, но я обнаружил это сегодня с row_number ().
Это приведет к некоторым повторяющимся номерам строк, так как в моем случае каждое имя содержит все элементы. Каждый товар будет заказан по количеству проданных товаров.
источник