1、要用到的函數 DENSE_RANK (Transact-SQL)
作用:返回結果集分區中行的排名,在排名中沒有任何間斷。行的排名等於所討論行之前的所有排名數加一。
語法:
DENSE_RANK ( ) OVER ( [ <partition_by_clause> ] < order_by_clause > )
參數
<partition_by_clause> ----------------->>就是分組
將 FROM 子句生成的結果集劃分爲數個應用 DENSE_RANK 函數的分區。若要了解 PARTITION BY 語法,請參閱 OVER 子句 (Transact-SQL)。
<order_by_clause>
確定將 DENSE_RANK 值應用於分區中各行的順序。整數不能表示排名函數中使用的 <order_by_clause> 中的列。
返回類型
bigint
註釋
如果有兩個或多個行受同一個分區中排名的約束,則每個約束行將接收相同的排名。例如,如果兩位頂尖銷售員具有相同的 SalesYTD 值,則他們將並列第一。接下來 SalesYTD 最高的銷售人員排名第二。該排名等於該行之前的所有行數加一。因此,DENSE_RANK 函數返回的數字沒有間斷,並且始終具有連續的排名。
整個查詢所用的排序順序確定了各行在結果中的顯示順序。這說明排名第一的行可以不是分區中的第一行。
其中 OVEROVER的語法:
Ranking Window Functions
< OVER_CLAUSE > :: =
OVER ( [ PARTITION BY value_expression , ... [ n ] ]
<ORDER BY_Clause> )
Aggregate Window Functions
< OVER_CLAUSE > :: =
OVER ( [ PARTITION BY value_expression , ... [ n ] ] )
參數
PARTITION BY
將結果集分爲多個分區。開窗函數分別應用於每個分區,併爲每個分區重新啓動計算。
value_expression
指定對相應 FROM 子句生成的行集進行分區所依據的列。value_expression 只能引用通過 FROM 子句可用的列。value_expression 不能引用選擇列表中的表達式或別名。value_expression 可以是列表達式、標量子查詢、標量函數或用戶定義的變量。
<ORDER BY 子句>
指定應用排名開窗函數的順序。有關詳細信息,請參閱 ORDER BY 子句 (Transact-SQL)。
重要提示:
在排名開窗函數的上下文中使用時,<ORDER BY 子句> 只能引用通過 FROM 子句可用的列。無法指定整數來表示選擇列表中列名稱或列別名的位置。<ORDER BY 子句>不能與聚合開窗函數一起使用。
示例
以下示例返回各位置上產品數量的 DENSE_RANK。注意,OVER 子句中的 ORDER BY 對 DENSE_RANK 進行排序,SELECT 語句的 ORDER BY 對結果集進行排序。
USE AdventureWorks2008R2;
GO
SELECT i.ProductID, p.Name, i.LocationID, i.Quantity,
DENSE_RANK() OVER (PARTITION BY i.LocationID ORDER BY i.Quantity) AS DENSE_RANK
FROM Production.ProductInventory i
INNER JOIN Production.Product p
ON i.ProductID = p.ProductID
ORDER BY Name;
GO
或
select t.* , 排名= DENSE_RANK() over(partition by cid order by score desc) from sc t order by t.CID ,排名
結果
SID CID score 排名
01 01 80.0 1
03 01 80.0 1
05 01 76.0 2
02 01 70.0 3
04 01 50.0 4
06 01 31.0 5
01 02 90.0 1
07 02 89.0 2
05 02 87.0 3
03 02 80.0 4
02 02 60.0 5
04 02 30.0 6
01 03 99.0 1
07 03 98.0 2
02 03 80.0 3
03 03 80.0 3
06 03 34.0 4
04 03 20.0 5
看清:CID=01 中有重複第一名