zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    MVP模式与MVVM模式
    webpack的配置处理
    leetcode 287 Find the Duplicate Number
    leetcode 152 Maximum Product Subarray
    leetcode 76 Minimum Window Substring
    感知器算法初探
    leetcode 179 Largest Number
    leetcode 33 Search in Rotated Sorted Array
    leetcode 334 Increasing Triplet Subsequence
    朴素贝叶斯分类器初探
  • 原文地址:https://www.cnblogs.com/zhyue93/p/SQL_row.html
Copyright © 2011-2022 走看看