SQL-OVER与四种排名函数:ROW_NUMBER(),RANK(),DENSE_RANK(),NTILE()



1
SELECT orderid,custid,val, 2 ROW_NUMBER() OVER(ORDER BY val) AS rownum, 3 RANK() OVER(ORDER BY val) AS rank, 4 DENSE_RANK() OVER(ORDER BY val) AS dense_rank, 5 NTILE(10) OVER(ORDER BY val) AS ntile 6 FROM Sales.OrderValues 7 ORDER BY val;

  ROW_NUMBER() 函数用于为查询的结果集中的各行分配递增的序列号,其逻辑顺序通过 OVER 子句中的 ORDER BY 语句进行指定。在查询例子中,逻辑顺序基于的是val列;因此,从输出中可以看到:随着订单价格的增加,行号也随之增加。不过,即使订单价格没有增加,行号还是会随之增加。所以如果 ROW_NUMBER() 函数的ORDER BY 不能唯一确定行的顺序,查询结果就是不确定的,可能查询出多个正确结果。例如,价格为 36.00 的两行,它们的行号分别为 7 和 8。如果这些行的顺序发生了变化,结果都可以认为是正确的,但不一定是你想要的。想让行号计算值是确定的,则必须在 ORDER BY 列表中添加元素,让它具有唯一性;也就是说,要让 ORDER BY 子句中列出的元素能够唯一地确定各个行。例如,可以在 ORDER BY 列表中增加 orderid 作为附加属性,这样,行号计算结果就是确定的。

  RANK() 函数在相同排序值生成的行号是同样的,并且之后的行号会跳过之前的行数

  DENSE_RANK() 函数在相同排序值生成的行号也是同样的,但之后的行号不会跳过缺省值,而是连续的

  NTILE(INT) 函数把结果中的行关联到组(title,相当于由行组成的指定数目的组),并为每一行分配一个所属组的编号

  PARTITION BY 子句-在 OVER 中使用分组,例:

1 SELECT orderid,custid,val,
2 ROW_NUMBER() OVER(PARTITION BY custid ORDER BY val) AS rownum
3 FROM Sales.OrderValues
4 ORDER BY custid,val

原文地址:https://www.cnblogs.com/zhyue93/p/SQL_row.html