SQL生成序號的四種方式

2022-06-09 13:15:11 字數 2865 閱讀 1389

排名函式是sql server2005新增的函式。排名函式總共有四種,分別是:row_number、rank、 dense_rank 、ntile。

row_number:順序生成序號。

rank:相同的序值序號相同,但序號會跳號。

dense_rank :相同的序值序號相同,序號順序遞增。

ntile:裝桶,把記錄分成指的桶數,編序號。

下面分別介紹一下這四個排名函式的功能及用法。在介紹之前假設有乙個t_table表,表結構與表中的資料如圖1所示:

圖1其中field1欄位的型別是int,field2欄位的型別是varchar。

一、row_number

row_number函式的用途是非常廣泛,這個函式的功能是為查詢出來的每一行記錄生成乙個序號。row_number函式的用法如下面的sql語句所示:

select row_number() over(order by field1) as row_number,* from t_table

上面的sql語句的查詢結果如圖2所示。

圖2其中row_number列是由row_number函式生成的序號列。在使用row_number函式是要使用over子句選擇對某一列進行排序,然後才能生成序號。

實際上,row_number函式生成序號的基本原理是先使用over子句中的排序語句對記錄進行排序,然後按著這個順序生成序號。over子句中的order by子句與sql語句中的order by子句沒有任何關係,這兩處的order by 可以完全不同,如下面的sql語句所示:

select row_number() over(order by field2 desc) as row_number,* from t_table order by field1 desc

上面的sql語句的查詢結果如圖3所示。

圖3我們可以使用row_number函式來實現查詢表中指定範圍的記錄,一般將其應用到web應用程式的分頁功能上。下面的sql語句可以查詢t_table表中第2條和第3條記錄: 

with t_rowtableas(select row_number() over(order by field1) as row_number,* from t_table

)

select * from t_rowtable where row_number>1 and row_number

上面的sql語句的查詢結果如圖4所示。

圖4另外要注意的是,如果將row_number函式用於分頁處理,over子句中的order by 與排序記錄的order by 應相同,否則生成的序號可能不是有續的。

二、rank

rank函式考慮到了over子句中排序字段值相同的情況,為了更容易說明問題,在t_table表中再加一條記錄,如圖5所示。

圖5

select rank() over(order by field1),* from t_table order by field1 

上面的sql語句的查詢結果如圖6所示。

圖6三、dense_rank

dense_rank函式的功能與rank函式類似,只是在生成序號時是連續的,而rank函式生成的序號有可能不連續。如上面的例子中如果使用dense_rank函式,第4條記錄的序號應該是2,而不是4。如下面的sql語句所示:

select dense_rank() over(order by field1),* from t_table order by field1 

面的sql語句的查詢結果如圖7所示。 

圖7四、ntile

ntile函式可以對序號進行分組處理。這就相當於將查詢出來的記錄集放到指定長度的陣列中,每乙個陣列元素存放一定數量的記錄。ntile函式為每條記錄生成的序號就是這條記錄所有的陣列元素的索引(從1開始)。也可以將每乙個分配記錄的陣列元素稱為「桶」。ntile函式有乙個引數,用來指定桶數。下面的sql語句使用ntile函式對t_table表進行了裝桶處理:

select ntile(4) over(order by field1) as bucket,* from t_table 

上面的sql語句的查詢結果如圖8所示。

圖8由於t_table表的記錄總數是6,而上面的sql語句中的ntile函式指定了桶數為4。

四種定址方式

直接在指令中給出運算元,不需要儲存單元,執行速度快,但是顯然資料也不能冗長,通用型性差,一般用來指定一些要求不高的整形整數。運算元 於暫存器,結果也寫回暫存器。顯然這個主要用到暫存器,這也是他的名字的由來。指令給出有效位址,這使得位址碼會很長,通用性也差。指令中給出的是運算元位址的位址,顯然就是要根...

四種監控方式

四種方式 logging tracing metrics healthcheck 1 研發成本來說 logging 比較低 metrics 一般 tracing比較高 2 運維成本來說 logging 比較高 3 相應能力來 metrics 比較好 4 解決問題來說 tracing 比較好 logg...

nocache的四種方式

nocache的四種方式 1.cdn的推方式 2.客戶端url方式 css需加a.css?2010.css 3.html cache meta 4.服務端cache 6.iis http頭式,建立虛擬目錄 以下 在asp頁面首部加入 複製內容到剪貼簿 response.buffer true res...