四大排名函數語法共通點
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;
結果示例:
| ProductID | Name | Price | RowNum | Rank | DenseRank | Quartile |
| 8 | Desk | 495.00 | 1 | 1 | 1 | 1 |
| 10 | Executive Chair | 295.00 | 2 | 2 | 2 | 1 |
| 9 | Chair | 125.00 | 3 | 3 | 3 | 2 |
| 5 | Mouse | 14.95 | 4 | 4 | 4 | 2 |
| 6 | Mousepad | 9.99 | 5 | 5 | 5 | 3 |
| ...同價產品... | ... | 8.50 | 6 | 6 | 6 | 3 |
| ...同價產品... | ... | 8.50 | 7 | 6 | 6 | 4 |
進階應用:分頁查詢最佳寫法
-- 使用 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 更簡潔,但排名函數功能更豐富。