sql分组取出每组最大一条_leetcode题库-sql练习精讲系列--八、分组求最大最小类问题...

926a2d2a607e3e9cf7645b0a84041ba2.png

这是一个系列文章,这个系列的理念是通过一道题,搞懂一类题。涵盖了SQL面试最常考的知识点。搞懂这些题,面试时工作中sql不可能有问题。

文章分为引入问题-完整解析-答案-leetcode题和答案-知识点拓展-BAT等大厂面试真题几个部分。

希望能帮你全方位的弄懂。有问题可以留言,码字不易,写一篇要好几个小时,希望能得到点赞收藏哦

一、问题

这里有一张学生成绩表,其中包含学生编号,课程编号,成绩;还有一张课程表,其中包含课程编号,课程名称。求每门课程编号,课程名称以及每门课程最高的成绩。

be1d9de8805e74942de4b91167876637.png

7f39380dd99d47c3ae6fba6bc64b69bd.png

二、准备

create table 课程(
    课程编号 varchar(10),
    课程名称 nvarchar(10),
    教师编号 varchar(10));

insert into 课程 values('01' , '语文' , '02');
insert into 课程 values('02' , '数学' , '01');
insert into 课程 values('03' , '英语' , '03');

create table `成绩`
(`学生编号` varchar(10),
`课程编号` varchar(10),
`成绩` decimal(18,1));

insert into `成绩` values('01' , '01' , 80);
insert into `成绩` values('01' , '02' , 90);
insert into `成绩` values('01' , '03' , 99);
insert into `成绩` values('02' , '01' , 70);
insert into `成绩` values('02' , '02' , 60);
insert into `成绩` values('02' , '03' , 80);
insert into `成绩` values('03' , '01' , 80);
insert into `成绩` values('03' , '02' , 80);
insert into `成绩` values('03' , '03' , 80);
insert into `成绩` values('04' , '01' , 50);
insert into `成绩` values('04' , '02' , 30);
insert into `成绩` values('04' , '03' , 20);
insert into `成绩` values('05' , '01' , 76);
insert into `成绩` values('05' , '02' , 87);
insert into `成绩` values('06' , '01' , 31);
insert into `成绩` values('06' , '03' , 34);
insert into `成绩` values('07' , '02' , 89);
insert into `成绩` values('07' , '03' , 98);

三、解答

[思路讲解]

1.首先确定题干要求的查询结果

其中课程名称保存在课程表中,成绩保存在成绩表中。两表都有课程编号。所以需要使用多表连接。还需要找出每科最高分,所以需要把课程编号和每科最高分作为关联两表的筛选条件加上。

select 课程.课程编号, 课程.课程名称, 成绩.每科最高分

2.先查找出每门课程的最高分。——确定查询条件

SELECT 课程编号, MAX(成绩)
FROM 成绩
GROUP BY 课程编号;

3.连接两表。确定连接主键和筛选条件。我们在第2步确定了查询条件,所以在这一步加到两表连接的筛选条件中。

select b.课程编号, b.课程名称, a.成绩
from 成绩 a
join 课程 b 
on a.课程编号=b.课程编号
where (a.课程编号,a.成绩) in
(select 课程编号,max(成绩) from 成绩 group by 课程编号);

4.考虑下有可能出现最高分重复的情况。所以在课程编号前加上去重函数

[代码]

select DISTINCT b.课程编号, b.课程名称, a.成绩
from 成绩 a
join 课程 b 
on a.课程编号=b.课程编号
where (a.课程编号,a.成绩) in
(select 课程编号,max(成绩) from 成绩 group by 课程编号);

[本题考点]

1.考察多表的连接。我们可以查看前面写过的多表连接的文。如果有多表连接问题,看下图就好。

ae2f2daef93b479c53087a5b23601fc4.png

2.考察子查询,且使用多列作为筛选条件

[本题答案]

[leetcode题库问题-184. 部门工资最高的员工 ]

Employee 表包含所有员工信息,每个员工有其对应的 Id, salary 和 department Id。

63a58964c79675913210aabf232ad255.png

Department 表包含公司所有部门的信息。

1e0e7d0503424c3760e916ee98ee29c9.png

编写一个 SQL 查询,找出每个部门工资最高的员工。例如,根据上述给定的表格,Max 在 IT 部门有最高工资,Henry 在 Sales 部门有最高工资。

[参考答案]

SELECT
    Department.name AS 'Department',
    Employee.name AS 'Employee',
    Salary
FROM
    Employee
        JOIN
    Department ON Employee.DepartmentId = Department.Id
WHERE
    (Employee.DepartmentId , Salary) IN
    (   SELECT
            DepartmentId, MAX(Salary)
        FROM
            Employee
        GROUP BY DepartmentId
    )
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值