sql SQL Server 中的排名函式

2021-08-18 06:14:13 字數 2937 閱讀 8268

前言

正文使用到的表原始資料 (select row_number() over (order by pk)as number ,pk,orderid,bopid,stepqueue from dbo.plm_bop_ppr where orderid = 『100000003921-03』)

返回結果集分割槽內行的序列號,每個分割槽的第一行從1開始,也需要專門一列用於存放排序後的編號。

語法

row_number ( )   

over ( [ partition by value_expression , ... [ n ] ] order_by_clause )

示例

-- 根據pk 的順序為當前表中記錄產生乙個順序列 

適用情況 : web分頁查詢顯示行號、一些需要排序資訊的應用中。

rank函式用於返回結果集的分區內每行的排名, 行的排名是相關行之前的排名數加一。與row_nmber()函式類似,不同的是rank()是跳躍排序。

rank函式考慮到了over子句中排序字段值相同的情況,如果使用rank函式來生成序號,over子句中排序字段值相同的序號是一樣的,後面不同的字段的序號將跳過相同的序號排下乙個,具體看例子吧。

語法

rank ( ) over ( [ partition_by_clause ]

order_by_clause )

示例

-- 按照 bopid 來進行排名 

-- bopid 相同的資料排名是一樣的,後面的排名根據當前的記錄數以此類推

dense_rank函式的功能與rank函式類似,rank函式在生成序列號時是跳躍的,而dense_rank函式是連續的。也就是說,當遇到相同排名時,將緊接著下一次的排名值增加。

語法

dense_rank ( ) over ( [  ] < order_by_clause > )
示例

一點小想法:rank()函式和dense_rank()函式可以用考試時的例子來理解,考試結束後,如果幾個同學考的分數一樣高老師發獎狀的時候會給他們發一樣名次的獎狀,a、b、c同學並列第一名,再低一點的分數是第二名、第三名,這便是dense_rank()的體現;但是在那全班同學的成績單上往往會根據學生姓名排名,即使分數一樣,也會顯示1、2、3名,成績第二名的同學在成績單上就體現為第四名,這便是rank()函式的體現。

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

語法

ntile (integer_expression) over ( [  ] < order_by_clause > )

integer_expression --指定組數

示例

分了3組,17 = 6 + 6 + 5

【分組約定】

1、每組的記錄數不能大於它上一組的記錄數,即編號小的組放的記錄數不能小於編號大的組。也就是說,第1組中的記錄數只能大於等於第2組及以後各組中的記錄數。

2、所有組中的記錄數要麼都相同,要麼從某乙個記錄較少的組(命名為x)開始後面所有組的記錄數都與該組(x組)的記錄數相同。也就是說,如果有個組,前三組的記錄數都是9,而第四組的記錄數是8,那麼第五組和第六組的記錄數也必須是8。

總結個人覺得排名函式中用的比較多的是row_number函式,當然了不同業務場景下還是要選適合的,今天的排名函式先介紹到這,期待下次再會~~

sqlserver 中select in的排序問題

直接select in的話,sql缺省會幫你排序,這個功能,有時很方便,但如果我們不需要它自動排序,就有點麻煩了 access中可以這樣 select fromtablewhere id in 10,6,9,20 orderby instr 10,6,9,20 cstr id desc sql中要這...

STl庫中的快排

acm做題過程中經常要用到排序,一般都選用快排,在此對快排做個總結 其中 用c表示 include include 必須包含該標頭檔案 struct 結構體型別名 資料型別 struct 空格 結構體型別名 陣列名 陣列大小 int 自定義函式名字 const void a,const void b...

IT管理中的節能與減排

在 能源危機 和 溫室效應 雙重大山重壓的今天,節能 與 減排 已成為當今世界各國的主題,也是全人類的雙重生存危機。地下的煤挖得差不多,地下的石油也抽得差不多了,未來我們用什麼做能源?每天那麼多汽車 工廠機械和電子裝置向大氣中排放那麼多廢氣,而我們幾十億人類每人每天都要從大氣中吸取大量氧氣,這樣下去...