[T-SQL] ROW_NUMBER() 次序函數,給我排排站好..其餘免談..

  • 13105
  • 0
  • SQL
  • 2018-04-24

 (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:很常用的東西…但是卻也很常忘記…>”<

 

 

 

水滴可成涓流,涓流可成湖泊大海。
汲取累積知識,將知識堆積成常識;將常識探究成學識;將學識簡化為知識;授人自省。