我搞不懂它们之间的区别。运行下面的SQL会得到两个相同的结果集。有人能解释一下其中的区别吗?

SELECT ID, [Description], RANK()       OVER(PARTITION BY StyleID ORDER BY ID) as 'Rank'      FROM SubStyle
SELECT ID, [Description], ROW_NUMBER() OVER(PARTITION BY StyleID ORDER BY ID) as 'RowNumber' FROM SubStyle

当前回答

相当多:

一行的秩是1加上前面一行的秩数。

Row_number是行的唯一秩,在秩上没有任何差距。

http://www.bidn.com/blogs/marcoadf/bidn-blog/379/ranking-functions-row_number-vs-rank-vs-dense_rank-vs-ntile

其他回答

ROW_NUMBER:为以1开头的每一行返回一个唯一的数字。对于具有重复值的行,将任意分配数字。

Rank:为从1开始的每一行分配一个唯一的数字,但有重复值的行除外,在这种情况下,分配相同的排名,并且在每个重复排名的序列中出现一个空白。

没有分区子句的简单查询:

select 
    sal, 
    RANK() over(order by sal desc) as Rank,
    DENSE_RANK() over(order by sal desc) as DenseRank,
    ROW_NUMBER() over(order by sal desc) as RowNumber
from employee 

输出:

    --------|-------|-----------|----------
    sal     |Rank   |DenseRank  |RowNumber
    --------|-------|-----------|----------
    5000    |1      |1          |1
    3000    |2      |2          |2
    3000    |2      |2          |3
    2975    |4      |3          |4
    2850    |5      |4          |5
    --------|-------|-----------|----------

相当多:

一行的秩是1加上前面一行的秩数。

Row_number是行的唯一秩,在秩上没有任何差距。

http://www.bidn.com/blogs/marcoadf/bidn-blog/379/ranking-functions-row_number-vs-rank-vs-dense_rank-vs-ntile

注意,所有这些窗口函数都返回一个类似整型的值。

数据库通常会选择BIGINT数据类型,这占用的空间比我们需要的大得多。而且,我们很少需要从-9,223,372,036,854,775,808到+9,223,372,036,854,775,807的范围。

将结果转换为BYTEINT、SMALLINT或INTEGER。

这些现代系统和硬件是如此强大,所以你可能永远不会看到有意义的额外资源使用,但我认为这是最佳实践。

我没有做任何关于秩的事情,但是我今天用row_number()发现了这一点。

select item, name, sold, row_number() over(partition by item order by sold) as row from table_name

这将导致一些重复的行号,因为在我的例子中,每个名称都包含所有项。每一件商品都将按售出的数量排序。

+--------+------+-----+----+
|glasses |store1|  30 | 1  |
|glasses |store2|  35 | 2  |
|glasses |store3|  40 | 3  |
|shoes   |store2|  10 | 1  |
|shoes   |store1|  20 | 2  |
|shoes   |store3|  22 | 3  |
+--------+------+-----+----+