我搞不懂它们之间的区别。运行下面的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
注意,所有这些窗口函数都返回一个类似整型的值。
数据库通常会选择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 |
+--------+------+-----+----+