• 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

  • 相关阅读:
    firewall详解
    Fiddler使用
    Asp.net Core过滤器
    单例模式
    C# 收银机顾显(客显)及打印小票(58热敏打印机)
    sqlite批量处理数据性能优化
    sqlite 插入数据 too many variables
    winform textbox控件keydown、keypress、keyup简单介绍
    ie兼容placeholder效果
    asp.net mvc全局异常捕获
  • 原文地址:https://www.cnblogs.com/zhyue93/p/SQL_row.html
Copyright © 2020-2023  润新知