zoukankan      html  css  js  c++  java
  • SQL Server 2005 TSQL 学习笔记:排名函数

    2005中共有四个排名函数:Row_Number, Rank(), Dense_Rank(), NTILE()

    Row_Number():
    按一个排序表达式,将查询结果编号,主要用于分页中使用.

    Row_Number()简单示例:

    select SalesOrderID, OrderDate, CustomerID, SalesPersonID,
    row_number() 
    over (order by CustomerID) as RowNumber
    from Sales.SalesOrderHeader
    where SalesPersonID is not null
    Order By CustomerID desc 
    --查询结果的排序可以不同于row_number中的排序,这时RowNumber列将被打乱

    结果:

    SalesOrderID OrderDate               CustomerID  SalesPersonID RowNumber
    ------------ ----------------------- ----------- ------------- --------------------
    50735        2003-06-01 00:00:00.000 701         285           3801
    48352        2002-12-01 00:00:00.000 701         285           3802
    49469        2003-03-01 00:00:00.000 701         285           3803
    71843        2004-06-01 00:00:00.000 701         285           3804
    53529        2003-09-01 00:00:00.000 701         285           3805
    59043        2003-12-01 00:00:00.000 701         285           3806
    63181        2004-02-01 00:00:00.000 700         279           3797
    ... ...

    Row_Number中可以实现按一列的值不同而重新编号,这时在order by 前面加入Partition by [列名]

    Row_Number中的分区示例:

     

    select SalesOrderID, OrderDate, CustomerID, SalesPersonID,
    row_number() 
    over (partition by SalesPersonID order by CustomerID) as RowNumber
    from Sales.SalesOrderHeader
    where SalesPersonID is not null and SalesOrderID > 65000


    结果:

    SalesOrderID OrderDate               CustomerID  SalesPersonID RowNumber
    ------------ ----------------------- ----------- ------------- --------------------
    71919        2004-06-01 00:00:00.000 38          268           1
    65298        2004-03-01 00:00:00.000 116         268           2
    67286        2004-04-01 00:00:00.000 120         268           3
    71779        2004-06-01 00:00:00.000 149         268           4
    69528        2004-05-01 00:00:00.000 309         268           5
    69545        2004-05-01 00:00:00.000 436         268           6
    65294        2004-03-01 00:00:00.000 489         268           7
    67277        2004-04-01 00:00:00.000 530         268           8
    65310        2004-03-01 00:00:00.000 3           275           1
    71889        2004-06-01 00:00:00.000 3           275           2
    67292        2004-04-01 00:00:00.000 4           275           3
    65315        2004-03-01 00:00:00.000 21          275           4
    ... ...

    Rank():
    用于对一列(多列也行)的值进行排名,有并列名次的,后面的名次会加上并列的次数.

    Rank简单示例:

    select SalesOrderID, OrderDate, CustomerID, SalesPersonID,
    Rank() 
    over ( order by CustomerID, SalesPersonID ) as Rank
    from Sales.SalesOrderHeader
    where SalesPersonID is not null and SalesOrderID > 10000

    结果
    SalesOrderID OrderDate               CustomerID  SalesPersonID Rank
    ------------ ----------------------- ----------- ------------- --------------------
    43860        2001-08-01 00:00:00.000 1           280           1
    44501        2001-11-01 00:00:00.000 1           280           1
    45283        2002-02-01 00:00:00.000 1           280           1
    46042        2002-05-01 00:00:00.000 1           280           1
    46976        2002-08-01 00:00:00.000 2           283           5
    47997        2002-11-01 00:00:00.000 2           283           5
    49054        2003-02-01 00:00:00.000 2           283           5
    50216        2003-05-01 00:00:00.000 2           283           5
    51728        2003-08-01 00:00:00.000 2           283           5
    57044        2003-11-01 00:00:00.000 2           283           5
    63198        2004-02-01 00:00:00.000 2           283           5
    69488        2004-05-01 00:00:00.000 2           283           5
    71889        2004-06-01 00:00:00.000 3           275           13

    ... ...

    和Row_Number一样,Rank也可以使用Partition By

    Dense_Rank():
    和Rank很像,只不过并列名次的,后面的名次连续显示.

    Dense_Rank简单示例:

    select SalesOrderID, OrderDate, CustomerID, SalesPersonID,
    Dense_Rank() 
    over ( order by CustomerID, SalesPersonID ) as Dense_Rank
    from Sales.SalesOrderHeader
    where SalesPersonID is not null and SalesOrderID > 10000


    结果
    SalesOrderID OrderDate               CustomerID  SalesPersonID Dense_Rank
    ------------ ----------------------- ----------- ------------- --------------------
    43860        2001-08-01 00:00:00.000 1           280           1
    44501        2001-11-01 00:00:00.000 1           280           1
    45283        2002-02-01 00:00:00.000 1           280           1
    46042        2002-05-01 00:00:00.000 1           280           1
    46976        2002-08-01 00:00:00.000 2           283           2
    47997        2002-11-01 00:00:00.000 2           283           2
    49054        2003-02-01 00:00:00.000 2           283           2
    50216        2003-05-01 00:00:00.000 2           283           2
    51728        2003-08-01 00:00:00.000 2           283           2
    57044        2003-11-01 00:00:00.000 2           283           2
    63198        2004-02-01 00:00:00.000 2           283           2
    69488        2004-05-01 00:00:00.000 2           283           2
    71889        2004-06-01 00:00:00.000 3           275           3

    ... ...

    NTILE(N):
    给定一个总名次N,将查询结果按指定的条件排名次,并列时,名次连续.

    NTILE的分区示例:

    select SalesOrderID, OrderDate, CustomerID, SalesPersonID,
    NTILE(
    10over ( partition by SalesPersonID order by CustomerID) as NTILE
    from Sales.SalesOrderHeader
    where SalesPersonID is not null and SalesOrderID > 60000

    结果
    SalesOrderID OrderDate               CustomerID  SalesPersonID NTILE
    ------------ ----------------------- ----------- ------------- --------------------
    71919        2004-06-01 00:00:00.000 38          268           1
    65298        2004-03-01 00:00:00.000 116         268           2
    67286        2004-04-01 00:00:00.000 120         268           3
    71779        2004-06-01 00:00:00.000 149         268           4
    61200        2004-01-01 00:00:00.000 205         268           5
    69528        2004-05-01 00:00:00.000 309         268           6
    61203        2004-01-01 00:00:00.000 421         268           7
    69545        2004-05-01 00:00:00.000 436         268           8
    65294        2004-03-01 00:00:00.000 489         268           9
    67277        2004-04-01 00:00:00.000 530         268           10
    65310        2004-03-01 00:00:00.000 3           275           1
    71889        2004-06-01 00:00:00.000 3           275           1
    67292        2004-04-01 00:00:00.000 4           275           1
    61193        2004-01-01 00:00:00.000 4           275           1
    65315        2004-03-01 00:00:00.000 21          275           1
    71881        2004-06-01 00:00:00.000 21          275           1
    69495        2004-05-01 00:00:00.000 22          275           1
    63162        2004-02-01 00:00:00.000 22          275           1
    65301        2004-03-01 00:00:00.000 39          275           1
    71912        2004-06-01 00:00:00.000 39          275           2

    ... ...

  • 相关阅读:
    java—— 字节流
    20-转>ES6转ES5的实现原理
    18-检验闭包是否真正理解?
    17-数组中去除基本数据类型和NaN的重复项(并保证原有数组顺序)
    16-实现一个Promise.all 和 Promise.race
    14-数组求和之递归方式
    13-斐波那契数列
    12-找到数组中的两项的和等于传入的指定数
    11-合并两个有序数组
    10-判断两个对象是否相等(有点类型every的实现)
  • 原文地址:https://www.cnblogs.com/rockniu/p/1232852.html
Copyright © 2011-2022 走看看