「这是我参与11月更文挑战的第16天,活动详情查看:2021最后一次更文挑战」
描述
题目:现在运营想要找到每个学校gpa最低的同学来做调研,请你取出每个学校的最低gpa。
示例:user_profile
根据示例,你的查询结果应参考以下格式:
示例1
drop table if exists user_profile;
CREATE TABLE `user_profile` (
`id` int NOT NULL,
`device_id` int NOT NULL,
`gender` varchar(14) NOT NULL,
`age` int ,
`university` varchar(32) NOT NULL,
`gpa` float,
`active_days_within_30` int ,
`question_cnt` int ,
`answer_cnt` int
);
INSERT INTO user_profile VALUES(1,2138,'male',21,'北京大学',3.4,7,2,12);
INSERT INTO user_profile VALUES(2,3214,'male',null,'复旦大学',4.0,15,5,25);
INSERT INTO user_profile VALUES(3,6543,'female',20,'北京大学',3.2,12,3,30);
INSERT INTO user_profile VALUES(4,2315,'female',23,'浙江大学',3.6,5,1,2);
INSERT INTO user_profile VALUES(5,5432,'male',25,'山东大学',3.8,20,15,70);
INSERT INTO user_profile VALUES(6,2131,'male',28,'山东大学',3.3,15,7,13);
INSERT INTO user_profile VALUES(7,4321,'male',28,'复旦大学',3.6,9,6,52);
6543|北京大学|3.200
4321|复旦大学|3.600
2131|山东大学|3.300
2315|浙江大学|3.600
方法一
根据题意需要我们求出每个学校最低的gpa,利用分组和排序,即按学校进行分组,再组内进行排序,得到一个有序的结果集,取出gpa最小的那条记录即可,上面分析过程中的分组加排序,正好是属于窗口函数的功能,所以我们利用窗口函数来完成此题;sql语句如下:
SELECT DISTINCT device_id, university, gpa
FROM (
SELECT device_id, university, gpa, RANK() OVER(PARTITION BY university ORDER BY gpa) AS `rank`
FROM user_profile
) t
WHERE t.rank=1;
注意在重命名时,由于rank是关键字,所以得加上引号;
方法二
我们也可以先分组,查出组内最小的gpa,在利用这个大学和最小的gpa,再去查表,同样也可以得到答案;
SELECT a.device_id,a.university,a.gpa FROM user_profile a
JOIN (SELECT university,min(gpa) gpa FROM user_profile GROUP BY university) b
on a.university=b.university and a.gpa=b.gpa
ORDER BY university;