下面的例子和SQL语句均在SQL Server 2008环境下运行通过,使用SQL Server自带的AdventureWorks数据库。

转载请注明此文原创自

CSDN TJVictor的专栏:http://blog.csdn.net/tjvictor/archive/2009/07/08/4331039.aspx

1.ROW_NUMBER()基本用法:

SELECT
  SalesOrderID,
  CustomerID,
  ROW_NUMBER() OVER (ORDER BY SalesOrderID) AS RowNumber
 FROM Sales.SalesOrderHeader
结果集:
SalesOrderID    CustomerID    RowNumber
--------------- ------------- ---------------
43659           676           1
43660           117           2
43661           442           3
43662           227           4
43663           510           5
43664           397           6
43665           146           7
43666           511           8
43667           646           9
 :
 
2.RANK()基本用法:

SELECT
  SalesOrderID,
  CustomerID,
  RANK() OVER (ORDER BY CustomerID) AS Rank
 FROM Sales.SalesOrderHeader
结果集:
SalesOrderID    CustomerID    Rank
--------------- ------------- ----------------
43860           1             1
44501           1             1
45283           1             1
46042           1             1
46976           2             5
47997           2             5
49054           2             5
50216           2             5
51728           2             5
57044           2             5
63198           2             5
69488           2             5
44124           3             13
 :
 
3.利用CTE来过滤ROW_NUMBER()的用法:

WITH NumberedRows AS
(
  SELECT
    SalesOrderID,
    CustomerID,
    ROW_NUMBER() OVER (ORDER BY SalesOrderID) AS RowNumber
   FROM Sales.SalesOrderHeader
)

SELECT * FROM NumberedRows
 WHERE RowNumber BETWEEN 100 AND 200
结果集:

SalesOrderID    CustomerID    RowNumber
--------------- ------------- --------------
43759           13257         100
43760           16352         101
43761           16493         102
 :
43857           533           199
43858           36            200
 
4.带Group by的ROW_NUMBER()用法:

WITH CustomerSum
AS
(
  SELECT CustomerID, SUM(TotalDue) AS TotalAmt
   FROM Sales.SalesOrderHeader
   GROUP BY CustomerID
)
SELECT
  *,
  ROW_NUMBER() OVER (ORDER BY TotalAmt DESC) AS RowNumber
 FROM CustomerSum
结果集:
CustomerID    TotalAmt        RowNumber
------------- --------------- ---------------
678           1179857.4657    1
697           1179475.8399    2
170           1134747.4413    3
328           1084439.0265    4
514           1074154.3035    5
155           1045197.0498    6
72            1005539.7181    7
 :
 
5.ROW_NUMBER()或是RANK()聚合用法:

WITH CustomerSum AS
(
  SELECT CustomerID, SUM(TotalDue) AS TotalAmt
   FROM Sales.SalesOrderHeader
   GROUP BY CustomerID
)
SELECT  *,
  RANK() OVER (ORDER BY TotalAmt DESC) AS Rank
--或者是ROW_NUMBER() OVER (ORDER BY TotalAmt DESC) AS Row_Number
 FROM CustomerSum
RANK()的结果集:
CustomerID  TotalAmt              Rank
----------- --------------------- --------------------
678         1179857.4657          1
697         1179475.8399          2
170         1134747.4413          3
328         1084439.0265          4
514         1074154.3035          5
 :
 
6.DENSE_RANK()基本用法:

SELECT
  SalesOrderID,
  CustomerID,
  DENSE_RANK() OVER (ORDER BY CustomerID) AS DenseRank
 FROM Sales.SalesOrderHeader
 WHERE CustomerID > 100
结果集:
SalesOrderID CustomerID  DenseRank
------------ ----------- --------------------
46950        101         1
47979        101         1
49048        101         1
50200        101         1
51700        101         1
57022        101         1
63138        101         1
69400        101         1
43855        102         2
44498        102         2
45280        102         2
46038        102         2
46951        102         2
47978        102         2
49103        102         2
50199        102         2
51733        103         3
57058        103         3
 :

7.RANK()与DENSE_RANK()的比较:

WITH CustomerSum AS
(
  SELECT
    CustomerID,
    ROUND(CONVERT(int, SUM(TotalDue)) / 100, 8) * 100 AS TotalAmt
   FROM Sales.SalesOrderHeader
   GROUP BY CustomerID
)
SELECT *,
  RANK() OVER (ORDER BY TotalAmt DESC) AS Rank,
  DENSE_RANK() OVER (ORDER BY TotalAmt DESC) AS DenseRank
 FROM CustomerSum
结果集:
CustomerID  TotalAmt    Rank    DenseRank
----------- ----------- ------- --------------------
697         1272500     1       1
678         1179800     2       2
170         1134700     3       3
328         1084400     4       4
 :
87          213300      170     170
667         210600      171     171
196         207700      172     172
451         206100      173     173
672         206100      173     173
27          205200      175     174
687         205200      175     174
163         204000      177     175
102         203900      178     176
 :

8.NTILE()基本用法:

SELECT
  SalesOrderID,
  CustomerID,
  NTILE(10000) OVER (ORDER BY CustomerID) AS NTile
 FROM Sales.SalesOrderHeader
结果集:
SalesOrderID    CustomerID    NTile
--------------- ------------- ---------------
43860           1             1
44501           1             1
45283           1             1
46042           1             1
46976           2             2
47997           2             2
49054           2             2
50216           2             2
51728           2             3
57044           2             3
63198           2             3
69488           2             3
44124           3             4
 :
45024           29475         9998
45199           29476         9998
60449           29477         9998
60955           29478         9999
49617           29479         9999
62341           29480         9999
45427           29481         10000
49746           29482         10000
49665           29483         10000

9.所有排序方法对比:

SELECT
  SalesOrderID AS OrderID,
  CustomerID,
  ROW_NUMBER() OVER (ORDER BY CustomerID) AS RowNumber,
  RANK() OVER (ORDER BY CustomerID) AS Rank,
  DENSE_RANK() OVER (ORDER BY CustomerID) AS DenseRank,
  NTILE(10000) OVER (ORDER BY CustomerID) AS NTile
 FROM Sales.SalesOrderHeader
结果集:
OrderID  CustomerID    RowNumber Rank    DenseRank NTile
-------- ------------- --------- ------- --------- --------
43860    1             1         1       1         1
44501    1             2         1       1         1
45283    1             3         1       1         1
46042    1             4         1       1         1
46976    2             5         5       2         2
47997    2             6         5       2         2
49054    2             7         5       2         2
50216    2             8         5       2         2
51728    2             9         5       2         3
57044    2             10        5       2         3
63198    2             11        5       2         3
69488    2             12        5       2         3
44124    3             13        13      3         4
44791    3             14        13      3         4
 :

10.PARTITION BY基本使用方法:

SELECT
  SalesOrderID,
  SalesPersonID,
  OrderDate,
  ROW_NUMBER() OVER (PARTITION BY SalesPersonID ORDER BY OrderDate) AS OrderRank
 FROM Sales.SalesOrderHeader
 WHERE SalesPersonID IS NOT NULL
结果集:
SalesOrderID    SalesPersonID    OrderDate    OrderRank
--------------- ---------------- ------------ --------------
 :
43659           279              2001-07-01 00:00:00.000    1
43660           279              2001-07-01 00:00:00.000    2
43681           279              2001-07-01 00:00:00.000    3
43684           279              2001-07-01 00:00:00.000    4
43685           279              2001-07-01 00:00:00.000    5
43694           279              2001-07-01 00:00:00.000    6
43695           279              2001-07-01 00:00:00.000    7
43696           279              2001-07-01 00:00:00.000    8
43845           279              2001-08-01 00:00:00.000    9
43861           279              2001-08-01 00:00:00.000    10
 :
48079           287              2002-11-01 00:00:00.000    1
48064           287              2002-11-01 00:00:00.000    2
48057           287              2002-11-01 00:00:00.000    3
47998           287              2002-11-01 00:00:00.000    4
48001           287              2002-11-01 00:00:00.000    5
48014           287              2002-11-01 00:00:00.000    6
47982           287              2002-11-01 00:00:00.000    7
47992           287              2002-11-01 00:00:00.000    8
48390           287              2002-12-01 00:00:00.000    9
48308           287              2002-12-01 00:00:00.000    10
 :

11.PARTITION BY聚合使用方法:
WITH CTETerritory AS
(
  SELECT
    cr.Name AS CountryName,
    CustomerID,
    SUM(TotalDue) AS TotalAmt
   FROM
    Sales.SalesOrderHeader AS soh
    INNER JOIN Sales.SalesTerritory AS ter ON soh.TerritoryID = ter.TerritoryID
    INNER JOIN Person.CountryRegion AS cr ON cr.CountryRegionCode = ter.
CountryRegionCode
   GROUP BY
    cr.Name, CustomerID
)
SELECT
  *,
  RANK() OVER(PARTITION BY CountryName ORDER BY TotalAmt, CustomerID DESC) AS Rank
 FROM CTETerritory

结果集:

CountryName    CustomerID    TotalAmt    Rank
-------------- ------------- ----------- --------------
Australia      29083         4.409       1
Australia      29061         4.409       2
Australia      29290         5.514       3
Australia      29287         5.514       4
Australia      28924         5.514       5
 :
Canada         29267         5.514       1
Canada         29230         5.514       2
Canada         28248         5.514       3
Canada         27628         5.514       4
Canada         27414         5.514       5
 :
France         24538         4.409       1
France         24535         4.409       2
France         23623         4.409       3
France         23611         4.409       4
France         20961         4.409       5
 :

12.PARTITION BY求平均数使用方法:

WITH CTETerritory AS
(
  SELECT
    cr.Name AS CountryName,
    CustomerID,
    SUM(TotalDue) AS TotalAmt
   FROM
    Sales.SalesOrderHeader AS soh
    INNER JOIN Sales.SalesTerritory AS ter ON soh.TerritoryID = ter.TerritoryID
    INNER JOIN Person.CountryRegion AS cr ON cr.CountryRegionCode = ter.
CountryRegionCode
   GROUP BY
    cr.Name, CustomerID
)
SELECT
  *,
  RANK() OVER (PARTITION BY CountryName ORDER BY TotalAmt, CustomerID DESC) AS Rank,
  AVG(TotalAmt) OVER(PARTITION BY CountryName) AS Average
 FROM CTETerritory

结果集:

CountryName    CustomerID    TotalAmt    Rank    Average
-------------- ------------- ----------- ------- ------------------
Australia      29083         4.409       1       3364.8318
Australia      29061         4.409       2       3364.8318
Australia      29290         5.514       3       3364.8318
 :
Canada         29267         5.514       1       12824.756
Canada         29230         5.514       2       12824.756
Canada         28248         5.514       3       12824.756
 :

转载请注明此文原创自CSDN TJVictor的专栏:http://blog.csdn.net/tjvictor/archive/2009/07/08/4331039.aspx

SQL Server 排序函数 ROW_NUMBER和RANK 用法总结的更多相关文章

  1. SQL Server排序函数row_number和rank的区别

    SQL Server排序函数row_number和rank的区别 直接看测试结果 declare @table table(name varchar(100),amount int, memo var ...

  2. SQL Server 排名函数( ROW_NUMBER、RANK、DENSE_RANK、NTILE )

    排名函数是Sql Server2005新增的功能,下面简单介绍一下他们各自的用法和区别.我们新建一张Order表并添加一些初始数据方便我们查看效果. CREATE TABLE [dbo].[Order ...

  3. sql server 2000 对应 sql server 2005的row_number()、rank()、DENSE_RANK( )、ntile( )等用法

    转自CSDN:http://blog.csdn.net/htl258/article/details/4006717 SQL server 2005新增的几个函数,分别是row_number( ).r ...

  4. mssql sqlserver 分组排序函数row_number、rank、dense_rank用法简介及说明

    在实际的项目开发中,我们经常使用分组函数,对组内数据进行群组后,然后进行组内排序:如:1:取出一个客户一段时间内,最大订单数的行记录2: 取出一个客户一段时间内,最后一次销售记录的行记录——————— ...

  5. SQL SERVER排序函数

    排名函数是SQL Server2005新加的功能.在SQL Server2005中有如下四个排名函数: 1.row_number 2.rank 3.dense_rank 4.ntile 下面分别介绍一 ...

  6. MySQL实现SQL Server排名函数

    最近在MySQL中遇到分组排序查询时,突然发现MySQL中没有row_number() over(partition by colname)这样的分组排序.并且由于MySQL中没有类似于SQL Ser ...

  7. Sql Server REPLACE函数的使用;SQL中 patindex函数的用法

    Sql Server REPLACE函数的使用 REPLACE用第三个表达式替换第一个字符串表达式中出现的所有第二个给定字符串表达式. 语法REPLACE ( ''string_replace1'' ...

  8. 数据库开发基础-SQl Server 聚合函数、数学函数、字符串函数、时间日期函数

    SQL 拥有很多可用于计数和计算的内建函数. 函数的语法 内建 SQL 函数的语法是: SELECT function(列) FROM 表 函数的类型 在 SQL 中,基本的函数类型和种类有若干种.函 ...

  9. SQL SERVER 2008- 字符串函数

    /* 1,ASCII返回字符表达式中最左侧字符的ASCII代码值 仅返回首字母的ASCII码值 parameter char或varchar returns integer */ SELECT ASC ...

随机推荐

  1. c#中virtual, abstract和override的区别和用法

    virtual是把一个方法声明为虚方法,使派生类可重写此方法,一般建立的方法是不能够重写的,譬如类A中有个方法protected void method(){ 原代码....;}类B继承自类A,类B能 ...

  2. wordpress的使用

    ubuntu 发送邮件学习资料: http://edu.51cto.com/lesson/id-6066.html 相关插件: Disable Google Fonts 使用中出现的问题: 1:wor ...

  3. 将一个字符串映射为一个Delphi页面控件属性名(通过FindComponent和GetPropInfo找到这个控件指针)

    uses TypInfo; function TForm1.SetControlProp(ComStr, value: string): boolean; var ComName, ComProp: ...

  4. 手势识别官方教程(4)在挑划或拖动手势后view的滚动用ScrollView和 HorizontalScrollView,自定义用Scroller或OverScroller

    简单滚动用ScrollView和 HorizontalScrollView就够.自定义view时可能要自定义滚动效果,可以使用 Scroller或 OverScroller Animating a S ...

  5. EventLog实现事件日志操作

    选中”我的电脑”,在其右键菜单中选择“管理”,在打开的对话框中包括了如下图所示的“日志”信息: 选中其中的某一条日志,可以看到如下的详细信息: 我们应该如何通过写代码的方式向其中添加“日志”呢? 在操 ...

  6. 【HDOJ】1857 Word Puzzle

    trie树.以puzzle做trie树内存不够,从puzzle中直接找串应该会TLE.其实可以将查询组成trie树,离线做.扫描puzzle时注意仅三个方向即可. /* 1857 */ #includ ...

  7. apache开源项目--Apache Commons Imaging

    Apache Commons Imaging 前身是 Apache Commons Sanselan ,这是一个用来读写各种图像格式的 Java 类库,包括快速解析图片的基本信息(大小.色彩空间.IC ...

  8. c语言实用功能库函数#include<stdlib.h>

    实用函数<stdlib.h> 在头文件<stdlib.h>中说明了用于数值转换.内存分配以及具有其他相似任务的函数. 1 atof #include <stdlib.h& ...

  9. C#基础回顾:正则表达式

    C#基础回顾:正则表达式 写在前面:本文根据笔者的学习体会结合相关书籍资料对正则表达式的语法和使用(C#)进行基本的介绍.适用于初学者. 摘要:正则表达式(Regular Expressions),相 ...

  10. .net文件压缩和解压及中文文件夹名称乱码问题

    /**************************注释区域内为引用http://www.cnblogs.com/zhaozhan/archive/2012/05/28/2520701.html的博 ...