SQL實現group by 分組後組內排序

2022-06-26 17:39:10 字數 2289 閱讀 3160

在乙個月黑風高的夜晚,自己無聊學習的sql的時候,練習,突發奇想的想實現乙個功能查詢,一張成績表有如下字段,班級id,英語成績,資料成績,語文成績如下圖

實現 查詢出 每個班級英語成績最高的前兩名的記錄。

看起來不難的業務,做起來才知道還挺麻煩的,說白了其實就是實現分組後的組內排序,一般不思考的話我們會寫出這樣的語句:

出現這個錯誤,應該就明白了其實資料庫的查詢順序是先分組的,最後才將結果進行排序。通過正常邏輯思考,通過班級分組,不就是分了三個組:班級1,班級2,班級3 。我們可以通過聚合函式查詢出,每個組的個數,平均值等。可是你後面跟了英語成績什麼鬼?分組之後意味著,我們不能查詢單個的記錄了,我們查詢的單位都是關於組的資訊。

第一種實現 1

select

*from

cj m

where(

select

count(*) from

cj n

where m.classid = n.classid and n.english > m.english)<

2order

by classid, english desc

也是當網上查的,可以這樣理解,要找出前兩名的成績,只要符合比你成績高的不超過2個人就行了。其實是乙個表的自連線,where條件就是一條一條記錄對比,首先在m表中拿一條記錄,是否符合 在同一班級中 比你成績高的不超過2個人。這樣就可以找到每個班的前兩名成績。然後按照降序排列。

在這種實現中,也可以加上其他篩選條件 比如查詢每個班級女生中英語成績前兩名的記錄

select

*from (select

*from cj where gender='女

') m

where(

select

count(*) from (select

*from cj where gender='女

') n

where m.classid = n.classid and n.english > m.english)<

2order

by classid, english desc

select

*from

cj m

where(

select

count(*) from

cj n

where m.classid = n.classid and n.english > m.english and n.gender='女

')<2--

指的是內錶

and gender='女

'--指的是外表

order

by classid, english desc

第二種是實現 2

select a.classid,a.english from

(select classid,english,row_number() over(partition by classid order

by english desc) as

nfrom

cj) a

where n<=

2

最官方,最好的實現方式 3

row_number() over (partition by col1 order by col2) 表示根據col1分組,在分組內部根據 col2排序,而此函式計算的值就表示每組內部排序後的順序編號(組內連續的唯一的)

同樣的加上條件

select a.classid,a.english,n,test from

(select classid,english,row_number() over(partition by classid order

by english desc) as n,123

test

from cj where cj.gender='女

') a

where n<=

2

可以看出先執行的是where 進行篩選後,再通過分組,組內再排序,排序後在新增編號,其實是和正常的執行順序一樣的,只不過位置變了

**-我才是酷酷的飛

sql分組資料GROUP BY

分組是使用select語句的group by子句建立的。理解分組最好的辦法就是看乙個例子 輸入 select vend id count as num prods from products group by vend id 輸出 vend id num prods brs01 3 dll01 4 ...

SQL,計算group by分組後組內不同值的數量

如現有一張購物表shopping name cargo小明筆 小明橡皮小明筆 小明橡皮 小明橡皮小紅筆 小紅橡皮 小紅橡皮 現要求小明和小紅分別買了多少筆和多少橡皮,形成以下格式姓名筆 橡皮小明23 小紅12select name as 姓名,sum case when cargo 筆 then 1...

group by分組統計SQL語句

用一條查詢語句,查出各姓名的數值餘額.使用者表 姓名a bc 扣費表 姓名 數值 a 3.5 b 5.2 a 2.充值表 姓名 數值 b 10 a 10 a 10.5 返回 姓名 差額 充值和 扣費和 測試通過 select table1.tname,table1.telname,table3.充值...