首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 2005 視窗排序函數實戰:ROW_NUMBER、RANK、DENSE_RANK、NTILE

     編輯:關於SqlServer

四大排名函數語法共通點

FUNCTION() OVER ( [PARTITION BY partition_column] ORDER BY sort_column [ASC|DESC] )
  • PARTITION BY:分組獨立計算排名,類似 GROUP BY 但不彙總。
  • ORDER BY:決定排名順序,必填。

函數行為差異對照

函數相同值處理下一名次典型用途
ROW_NUMBER() 強制唯一,依 ORDER BY 細節或任意順序編號 +1 分頁、去重取第一筆
RANK() 相同值同名次,跳過後續名次 +N (N=同名次筆數) 競賽排名、銷售業績前 N
DENSE_RANK() 相同值同名次,不跳過後續名次 +1 連續等級分布、薪資等級
NTILE(n) 將資料分成 n 個桶,桶編號 1~n 桶編號 四分位數、十分位數分析

實戰範例:Products 價格排名

SELECT ProductID, Name, Price,
       ROW_NUMBER() OVER (ORDER BY Price DESC) AS RowNum,
       RANK() OVER (ORDER BY Price DESC) AS Rank,
       DENSE_RANK() OVER (ORDER BY Price DESC) AS DenseRank,
       NTILE(4) OVER (ORDER BY Price DESC) AS Quartile
FROM Products;

結果示例:

ProductIDNamePriceRowNumRankDenseRankQuartile
8Desk495.001111
10Executive Chair295.002221
9Chair125.003332
5Mouse14.954442
6Mousepad9.995553
...同價產品......8.506663
...同價產品......8.507664

進階應用:分頁查詢最佳寫法

-- 使用 CTE + ROW_NUMBER (SQL 2005+)
WITH Paged AS (
    SELECT *, ROW_NUMBER() OVER (ORDER BY Freight) AS RowNum
    FROM Orders
)
SELECT OrderId, Freight
FROM Paged
WHERE RowNum BETWEEN 20 AND 30;

限制與注意事項

  • 排名函數不能直接用於 WHERE 子句,需包裝在 CTE/衍生表/視圖中。
  • PARTITION BY 欄位若含 NULL,NULL 視為單一群組參與排名。
  • 大量資料排序可能溢出 TempDB,確保足夠磁碟空間。
  • SQL Server 2012+ 新增 OFFSET ... FETCH 更簡潔,但排名函數功能更豐富。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved