sql server中排名的問題

2022-05-27 09:57:08 字數 4500 閱讀 6139

rank,dense_rank,row_number區別

一:語法(用法):

rank() over([partition by col1] order by col2)

dense_rank() over([partition by col1] order by col2)

row_number() over([partition by col1] order by col2)

其中[partition by col1]可省略。

二:區別

三個分析函式都是按照col1分組內從1開始排序

row_number() 是沒有重複值的排序(即使兩天記錄相等也是不重複的),可以利用它來實現分頁

dense_rank() 是連續排序,兩個第二名仍然跟著第三名

rank()       是跳躍拍學,兩個第二名下來就是第四名

理論就不多講了,看了案例,一下就明白了

sql> create table t(

2   name varchar2(10),

3   score number(3));

table created

sql> insert into t(name,score) 

select '語文',60 from dual union all

select '語文',90 from dual union all

select '語文',80 from dual union all

select '語文',80 from dual union all

select '數學',67 from dual union all

select '數學',77 from dual union all

select '數學',78 from dual union all

select '數學',88 from dual union all

select '數學',99 from dual union all

select '語文',70 from dual

10 rows inserted

sql> select * from t;

name       score

---------- -----

語文          60

語文          90

語文          80

語文          80

數學          67

數學          77

數學          78

數學          88

數學          99

語文          70

10 rows selected

sql> select name,score,rank() over(partition by name order by score) tt from t;

name       score         tt

---------- ----- ----------

數學          67          1

數學          77          2

數學          78          3

數學          88          4

數學          99          5

語文          60          1

語文          70          2

語文          80          3   <----

語文          80          3   <----

語文          90          5

10 rows selected

sql> select name,score,dense_rank() over(partition by name order by score) tt from t;

name       score         tt

---------- ----- ----------

數學          67          1

數學          77          2

數學          78          3

數學          88          4

數學          99          5

語文          60          1

語文          70          2

語文          80          3   <----

語文          80          3   <----

語文          90          4

10 rows selected

sql> select name,score,row_number() over(partition by name order by score) tt from t;

name       score         tt

---------- ----- ----------

數學          67          1

數學          77          2

數學          78          3

數學          88          4

數學          99          5

語文          60          1

語文          70          2

語文          80          3  <----

語文          80          4  <----

語文          90          5

10 rows selected

sql> select name,score,rank() over(order by score) tt from t;

name       score         tt

---------- ----- ----------

語文          60          1

數學          67          2

語文          70          3

數學          77          4

數學          78          5

語文          80          6

語文          80          6

數學          88          8

語文          90          9

數學          99         10

10 rows selected

大家應該明白了吧!呵呵!接下來看應用

一:dense_rank------------------查詢每門功課前三名

select name,score from (select name,score,dense_rank() over(partition by name order by score desc) tt from t) x where x.tt<=3  

name       score ---------- -----

數學          99

數學          88

數學          78

語文          90

語文          80

語文          80

6 rows selected

二:rank------------------語文成績70分的同學是排名第幾。   

select name,score,x.tt from (select name,score,rank() over(partition by name order by score desc) tt from t) x where x.name='語文' and x.score=70

name       score         tt ---------- ----- ----------

語文          70               4    

三:row_number——————分頁查詢     

select xx.* from (select t.*,row_number() over(order by score desc) rowno from t) xx where xx.rowno between 1 and 3;

name       score      rowno ---------- ----- ----------

數學          99          1

語文          90          2

數學          88          3

mysql 中排序問題

現在有這樣一張表user,欄位為id,name,number.想要實現這樣的效果,以number排序,查詢某個id所在的資料排在第幾位,假如這個資料有幾個相同的,那麼取它為最低排名.例如有這麼幾行 id name number 1 a 10 2 b 20 3 c 10 4 d 5 現在查詢id為3的...

提高在google中排名計算方法

google的排名運算法則主要使用了兩個部分,第乙個部分是它的文字內容匹配系統。google使用該系統來發現與搜尋者鍵入的搜尋詞相關的網頁 第二部分也是排名運算法則中最最重要的部分,就是google的專利網頁級別技術.google將從乙個網頁的頭幾行文字內容來生成對乙個 的描述。也就是說,你最好把你...

SQLSERVER常用排名方法

有如下表及資料 一,常用基於什麼排名,按 排序 select row number over order by book price desc as book rank,price,book name from books 如下圖1 二,名次或者分數一樣,並列排名 select top 10 boo...