(Transact-SQL) 序次函數 ROW_NUMBER()、 RANK()、DENSE_RANK()、NTILE()
給我排排站好..其餘免談@@|||
由於資料有時候並不會有流水序號可供判定資料的位置,因此就會需要讓他產生流水編號,產生的方法有以下幾種函數,排名函數會傳回資料分割中每個資料列各一個次序值。根據所用的函數而定,有些資料列可能會收到與其他資料列相同的值。排名函數不具決定性。
ROW_NUMBER() 從頭排到尾
RANK() 依據相同的值給予同一編號,但是下次給號”會跳號”(常用於排名次)
DENSE_RANK() 依據相同的值給予同一編號,但是下次給號”不會跳號”(常用於排名次)
NTILE() 依據給予的引數,給予資料列散發到指定數目的群組中,對於每個資料列,NTILE 都會傳回資料列所屬群組的號碼。
詳細說明請參閱TechNet
http://technet.microsoft.com/zh-tw/library/ms189798.aspx
------以下是範例直接複製到SSMS執行即可-----
--DECLARE @Table,宣告一個變數資料表
DECLARE @Employee TABLE
( EmpId Varchar(10),
EmpName Varchar(25),
EmpSalary Numeric(12,0)
)
--Insert sample records,寫入幾筆樣本資料
INSERT INTO @Employee VALUES( 'Emp202', 'Ravi', 2000000)
INSERT INTO @Employee VALUES( 'Emp198', 'Shekar', 678000)
INSERT INTO @Employee VALUES( 'Emp234', 'Karim', 805000)
INSERT INTO @Employee VALUES( 'Emp234', 'Karim', 879000)
INSERT INTO @Employee VALUES( 'Emp234', 'Karim', 2350000)
INSERT INTO @Employee VALUES( 'Emp184', 'John', 975000)
INSERT INTO @Employee VALUES( 'Emp151', 'Suresh', 689000)
INSERT INTO @Employee VALUES( 'Emp151', 'Suresh', 879000)
--Query the table,執行語法!
SELECT
ROW_NUMBER() OVER ( ORDER BY EmpId DESC ) AS 依照EmpId排序,
EmpId, EmpName, EmpSalary
FROM @Employee
SELECT
ROW_NUMBER() OVER ( PARTITION BY EmpName ORDER BY EmpId DESC ) AS 依照EmpName群組後排序,
EmpId, EmpName, EmpSalary
FROM @Employee
SELECT
RANK() OVER(ORDER BY EmpId) AS 跳號 ,
EmpId, EmpName, EmpSalary
FROM @Employee
SELECT
DENSE_RANK(2) OVER(ORDER BY EmpId) AS 不會跳號 ,
EmpId, EmpName, EmpSalary
FROM @Employee
SELECT
NTILE(3) OVER(ORDER BY EmpId) AS 每三列編一號 ,
EmpId, EmpName, EmpSalary
FROM @Employee
PS:很常用的東西…但是卻也很常忘記…>”<
水滴可成涓流,涓流可成湖泊大海。
汲取累積知識,將知識堆積成常識;將常識探究成學識;將學識簡化為知識;授人自省。