前言

在前一篇文章,我們簡單介紹了 ROW_NUNBER的使用方法與案例,在這一篇文章,我們會對於其他序列函數,包含RANK, DENSE_RANK, NTILE進行介紹與比較。本篇文章若有錯誤或任何建議,請各位前輩不吝指教。

關鍵字:RANK, DENSE_RANK, NTILE


介紹

在介紹這些序列函數之前,我們先簡單建立範例資料表與資料。





RANK 函式

使用方法如下
RANK (integer_expression) 
 OVER ( [<partition_by >] < ORDER_BY_CLAUSE > ) 
RANK 主要會依據指定的資料欄位排序進行編號,當資料內容相同時,其序號會一致;連續相同資料後遇到不同資料,其序號會以 原序號+連續資料比數繼續排序。我們下列語法為例說明:
SELECT [Id]
      ,[Name]
      ,[Salary]
      ,RANK() OVER (ORDER BY [SALARY] DESC) AS [Rank]
  FROM [test].[dbo].[Employee]

我們透過薪水作為依據:你會發現排序的時候,金額重複的部分會有相同的排序,但後續的資料並不會接續排序。以下結果為例,你可以看見不重複的排序會從7開始。



DENSE_RANK 函式

使用方法如下
DENSE_RANK (integer_expression) 
 OVER ( [<partition_by >] &; ORDER_BY_CLAUSE > ) 
DENSE_RANK 與 RANK 相似,最大的不同在於排序的序號會接續下去,我們以下列語法為例:
    SELECT [Id]
          ,[Name]
          ,[Salary]
          ,DENSE_RANK() OVER (ORDER BY [SALARY] DESC) AS [Rank]
      FROM [test].[dbo].[Employee]
你會發現不重複排序後,會接續排序。以下結果為例,你可以看節排序從5繼續延伸下去。



NTILE 函式

使用方法如下
NTILE (integer_expression) 
 OVER ( [<partition_by >] < ORDER_BY_CLAUSE > ) 
NTILE 函式比較有趣一點,與DENSE_RANK 與 RANK 相似,最大不同點在於會依據欄位資料內容進行等比例分割(輸入參數為想要份數),並給予序號。我們以下列語法為例,我們要把資料分成四份:
SELECT [Id]
      ,[Name]
      ,[Salary]
      ,NTILE (4)  OVER (ORDER BY [SALARY] DESC) AS [Rank]
  FROM [test].[dbo].[Employee]
結果,我們可以看見資料被分成四等分,相當簡單:


參考資料

1.NTILE (Transact-SQL) - Microsoft Doc
2.程式設計師之家 - dotblog

相關文章

[Database][SQL Server] 序列函數 ROW_NUMBER