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

  • 相关阅读:
    Agile PLM opmn can not started
    参数化模块设计技术
    Enable the Load to CAD Action menu
    Agile Product Collaboration
    Configuration Handling SolidWorks
    SolidWorks 动画模拟仿真
    Agile PLM PC 模块实施方法论
    单因素方差分析的SAS实现
    非参中多样本的趋势秩检验的计算机实现
    游戏数据分析中“次日留存率”与“游戏生命周期第N天上线率”的SAS实现
  • 原文地址:https://www.cnblogs.com/zhyue93/p/SQL_row.html
Copyright © 2011-2022 走看看