個人學習記錄之sql server partition分區與group by 分組


 

     例子:在一個StudentScore表中,有序號ID,班級ClassId,學生姓名Name,性別Sex,語文成績ChineseScore,數學成績MathScore,平均成績AverageScore等等一些學生成績及個人信息字段

     問一:每個班級中,平均成績在60(含60)分以上的學生人數?

     問二:每個班級中本次考試平均成績是班級前三的同學的所有信息?

     問三:每個班級中語文與數學都達到60(含60)分以上的同學的所有信息?

一、Group By 分組

   select count(ClassId) from StudentScore where  AverageScore>=60  group by ClassId

   group by + 字段 A:根據字段A分組查詢,通常group by 是與聚合函數連用的,因為當group by 存在時,select查詢的字段要么是在group by子句中,要么存在聚合函數中,當select后字段獨立時,編譯器將會報錯。錯誤例子:select A,count(B),C from tabel group by A;  錯誤原因:字段C既沒有在group by子句中,也沒有在聚合函數中

 

二、partition by分區函數(此處只是partition的一小部分功能)

   因為要查看每個班級中達到條件的同學的所有信息,那么根據group by的特性可知,此處已不適合使用group by。

   select * from (select Row_Number() Over(partition by ClassId order by AverageScore desc) rownum,* from StudentScore) Score where rownum>0 and rownum<4

   解釋:首先根據班級ClassId進行分區,在此基礎上再對平均分AverageScore進行降序排列。

   partition by 分區函數可以根據某字段分區並返回所有結果集,作為分區函數一般與Row_Number() over()排序一起連用,可實現分區排序的功能。個人覺得:主要是可以返回查詢到的、包含所有字段的結果集。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM