SQL基礎第四講 分析函式之組內排序

2021-10-07 19:19:22 字數 1876 閱讀 1320

sql基礎第四講:分析函式之組內排序

看python教程看的有點疲乏,還是寫點東西吧~

為什麼說是簡講呢,其實分析函式在工作中用到的地方也是非常多的,但是它可以實現的方面有很多,這裡給大家講三方面:1.分組內排序、2.分組內求聚合、3.計算行與行資料之間的偏移量。(ps:當你學會分析函式,相信我,你會愛上它!)

江湖慣例,先拿excel開刀,有這樣乙個場景,我們學校有8個班級,名字就叫

一、二、三...班,每個班裡有n名學生,現在老師想要看到,每個學生在班裡面的排名和在整個年級的排名,大致模型就是這樣:

說回正題,我們還是先在資料庫中建立表用於儲存這些資料:

create table student(xh int(10),bj char(10),cj int(10));

insert into student values (20001 ,『一班』, 510);

insert into student values (20002 ,『二班』, 630);

insert into student values (20003 ,『二班』, 200);

insert into student values (20004 ,『三班』, 350);

insert into student values (20005 ,『一班』, 500);

insert into student values (20006 ,『二班』, 150);

insert into student values (20007 ,『三班』, 140);

insert into student values (20008 ,『三班』, 140);

insert into student values (20009 ,『三班』, 120);

然後我們執行下面查詢:
select xh,bj,cj,

可以看到,資料已經按照我們的規則,進行排序,在這裡我們看到,其中 20008 和20007 學號的學生成績相同,在這裡做了個當成績相同時,按照學號從大到小進行排序。

接下來我們來分析一下這個函式
row_number()over(partition by 分組列, order by 排序列)

前面的row_number()over是不變的,後面括號中的內容是關鍵,在這裡我們需要對每個班級的學生成績都進行排序,所以需要把每個班都分成一組一組,也就是partition by 後面跟上班級列,如果是按照年級分組,我們這裡全表就乙個年級的資料,所以不寫分組,就是把全部資料當做一組。然後後面跟上我們的學生成績,desc就是說是按照從大到小 也就是從高到低 進行排序,可以有多個排序字段,比如當成績相同的時候,後面可以跟上按照學號從小到大進行排序,也就是asc 。分組和排序都一樣,可以有0個或者多個字段。

但是有的老師可能想看到更加公平的結果,就是成績相同的學生名次也相同,但是會產生乙個新的問題,就是再往下的 20009號學生 排名多少,是按照上兩名都是第二名 ,然後它是第三名,還是說這直接跨越第三名,把它排到第四名,這裡就引出來row_number()的兩個兄弟函式:dense_rank()和rank():

OC基礎第四講 字典

字典類 字典用於儲存具有對映關係 key value 的資料集合 對於name 張三來講,name就是key,key對應的value就是張三 乙個key value的組合被認為是乙個條目,字典是儲存key value對容器 字典類的特點 與陣列不同,字典靠key訪問元素 陣列是通過下標來訪問元素 k...

編譯原理(第四講 自下而上分析)

求fistvt和lastvt 判斷是否為算符優先文法 構造算符優先分析表 輸入串給出分析過程 1.求firstvt lastvt firstvt 找firstvt的三條規則 如果要找a的firstvt,a的候選式 現 a a 即以終結符開頭,該終結符入firstvt a b 即以非終結符開頭,該非終...

爬蟲核心基礎第四講(requests庫)

pip install requests 練習兩種,第二種是裝飾器 class person def init self,name self.name name defname self return self.name p person 葫蘆娃 print p.name class person ...