ROW_NUMBER() OVER函数的基本用法

来源:互联网 发布:宜家值得买 知乎 编辑:程序博客网 时间:2024/06/05 06:52
语法
ROW_NUMBER ( )     OVER ( [ PARTITION BY value_expression , ... [ n ] ] order_by_clause )
参数
PARTITION BY value_expression

将 FROM 子句生成的结果集划入应用了 ROW_NUMBER 函数的分区。value_expression 指定对结果集进行分区所依据的列。如果未指定 PARTITION BY,则此函数将查询结果集的所有行视为单个组。有关详细信息,请参阅 OVER 子句 (Transact-SQL)

order_by_clause

ORDER BY 子句可确定在特定分区中为行分配唯一 ROW_NUMBER 的顺序。它是必需的。有关详细信息,请参阅 OVER 子句 (Transact-SQL)

返回类型:bigint
*

不保证使用 ROW_NUMBER() 的查询返回的行对于每次执行在顺序上保持完全相同,除非以下条件成立。

  1. 分区列的值是唯一的。

  2. ORDER BY 列的值是唯一的。

  3. 分区列和 ORDER BY 列的值的组合是唯一的。

    A.返回销售人员的行号

    以下示例根据销售人员年初至今的销售额,计算 Adventure Works Cycles 中销售人员的行号。

    USE AdventureWorks2012; GOSELECT ROW_NUMBER() OVER(ORDER BY SalesYTD DESC) AS Row,     FirstName, LastName, ROUND(SalesYTD,2,1) AS "Sales YTD" FROM Sales.vSalesPersonWHERE TerritoryName IS NOT NULL AND SalesYTD <> 0;

    下面是结果集:

    Row FirstName    LastName               SalesYTD--- -----------  ---------------------- -----------------1   Linda        Mitchell               4251368.542   Jae          Pak                    4116871.223   Michael      Blythe                 3763178.174   Jillian      Carson                 3189418.365   Ranjit       Varkey Chudukatil      3121616.326   José         Saraiva                2604540.717   Shu          Ito                    2458535.618   Tsvi         Reiter                 2315185.619   Rachel       Valdez                 1827066.7110  Tete         Mensa-Annan            1576562.1911  David        Campbell               1573012.9312  Garrett      Vargas                 1453719.4613  Lynn         Tsoflias               1421810.9214  Pamela       Ansman-Wolfe           1352577.13


    B.返回行的子集

    下面的示例按 OrderDate 的顺序计算 SalesOrderHeader 表中所有行的行号,并只返回行 5060(含)。

    USE AdventureWorks2012;GOWITH OrderedOrders AS(    SELECT SalesOrderID, OrderDate,    ROW_NUMBER() OVER (ORDER BY OrderDate) AS RowNumber    FROM Sales.SalesOrderHeader ) SELECT SalesOrderID, OrderDate, RowNumber  FROM OrderedOrders WHERE RowNumber BETWEEN 50 AND 60;

    C.将 ROW_NUMBER () 与 PARTITION 一起使用

    以下示例使用 PARTITION BY 参数按列 TerritoryName 对结果集进行分区。OVER 子句中指定的 ORDER BY 子句按列 SalesYTD 对每个分区中的行进行排序。SELECT 语句中的 ORDER BYTerritoryName 子句对整个查询结果集中进行排序。


    USE AdventureWorks2012;GOSELECT FirstName, LastName, TerritoryName, ROUND(SalesYTD,2,1),ROW_NUMBER() OVER(PARTITION BY TerritoryName ORDER BY SalesYTD DESC) AS RowFROM Sales.vSalesPersonWHERE TerritoryName IS NOT NULL AND SalesYTD <> 0ORDER BY TerritoryName;
    下面是结果集:

    FirstName  LastName             TerritoryName        SalesYTD      Row---------  -------------------- ------------------   ------------  ---Lynn       Tsoflias             Australia            1421810.92    1José       Saraiva              Canada               2604540.71    1Garrett    Vargas               Canada               1453719.46    2Jillian    Carson               Central              3189418.36    1Ranjit     Varkey Chudukatil    France               3121616.32    1Rachel     Valdez               Germany              1827066.71    1Michael    Blythe               Northeast            3763178.17    1Tete       Mensa-Annan          Northwest            1576562.19    1David      Campbell             Northwest            1573012.93    2Pamela     Ansman-Wolfe         Northwest            1352577.13    3Tsvi       Reiter               Southeast            2315185.61    1Linda      Mitchell             Southwest            4251368.54    1Shu        Ito                  Southwest            2458535.61    2Jae        Pak                  United Kingdom       4116871.22    1