Sql Server系列:排序函式

libingql發表於2014-12-04

  在SQL Server中有4個排序函式:ROW_NUMBER()、RANK()、DENSE_RANK()及NTILE()函式。

1. ROW_NUMBER()函式

  ROW_NUMBER()函式為每條記錄新增遞增的順序數值序號,即使存在相同的值也遞增序號。

  示例:

SELECT ROW_NUMBER() OVER (ORDER BY [CategoryID] DESC) AS ROWID, [CategoryID], [CategoryName]
FROM [dbo].[Category]
WITH SortedProduct AS
(
    SELECT ROW_NUMBER() OVER (ORDER BY [CategoryID] DESC) AS [ROW_NUMBER], [CategoryID], [CategoryName]
    FROM [dbo].[Category]
)
SELECT * FROM SortedProduct
WHERE [ROW_NUMBER] BETWEEN 2 AND 5

2. RANK()函式

  返回結果集的分割槽內每行的排名,如果兩個或多個行與一個排名關聯,則每個關聯行將得到相同的排名。

  示例:

SELECT RANK() OVER (ORDER BY [UnitsInStock] DESC) AS [ROW_NUMBER],[ProductID],[ProductName],[UnitsInStock]
FROM [dbo].[Product]

  對於相同的[UnitsInStock],查詢返回相同的排名。

3. DENSE_RANK()函式

  DENSE_RANK()函式返回結果集分割槽中行的排名,在排名中沒有任何間斷。 行的排名等於所討論行之前的所有排名數加一。

  示例:

SELECT DENSE_RANK() OVER (ORDER BY [UnitsInStock] DESC) AS [ROW_NUMBER],[ProductID],[ProductName],[UnitsInStock]
FROM [dbo].[Product]

4. NTILE()函式

  將有序分割槽中的行分發到指定數目的組中。 各個組有編號,編號從1開始。 對於每一個行,NTILE 將返回此行所屬的組的編號。

  語法:

NTILE (integer_expression) OVER ( [ <partition_by_clause> ] < order_by_clause > )

  示例:

SELECT NTILE(5) OVER (ORDER BY [UnitsInStock] DESC) AS [ROW_NUMBER],[ProductID],[ProductName],[UnitsInStock]
FROM [dbo].[Product]

相關文章