在乙個月黑風高的夜晚,自己無聊學習的sql的時候,練習,突發奇想的想實現乙個功能查詢,一張成績表有如下字段,班級id,英語成績,資料成績,語文成績如下圖
實現 查詢出 每個班級英語成績最高的前兩名的記錄。
看起來不難的業務,做起來才知道還挺麻煩的,說白了其實就是實現分組後的組內排序,一般不思考的話我們會寫出這樣的語句:
出現這個錯誤,應該就明白了其實資料庫的查詢順序是先分組的,最後才將結果進行排序。通過正常邏輯思考,通過班級分組,不就是分了三個組:班級1,班級2,班級3 。我們可以通過聚合函式查詢出,每個組的個數,平均值等。可是你後面跟了英語成績什麼鬼?分組之後意味著,我們不能查詢單個的記錄了,我們查詢的單位都是關於組的資訊。
第一種實現 1
select也是當網上查的,可以這樣理解,要找出前兩名的成績,只要符合比你成績高的不超過2個人就行了。其實是乙個表的自連線,where條件就是一條一條記錄對比,首先在m表中拿一條記錄,是否符合 在同一班級中 比你成績高的不超過2個人。這樣就可以找到每個班的前兩名成績。然後按照降序排列。*from
cj m
where(
select
count(*) from
cj n
where m.classid = n.classid and n.english > m.english)<
2order
by classid, english desc
在這種實現中,也可以加上其他篩選條件 比如查詢每個班級女生中英語成績前兩名的記錄
select第二種是實現 2*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
select a.classid,a.english from最官方,最好的實現方式 3(select classid,english,row_number() over(partition by classid order
by english desc) as
nfrom
cj) a
where n<=
2
row_number() over (partition by col1 order by col2) 表示根據col1分組,在分組內部根據 col2排序,而此函式計算的值就表示每組內部排序後的順序編號(組內連續的唯一的)
同樣的加上條件
select a.classid,a.english,n,test from可以看出先執行的是where 進行篩選後,再通過分組,組內再排序,排序後在新增編號,其實是和正常的執行順序一樣的,只不過位置變了(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
**-我才是酷酷的飛
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.充值...