问题:假设有张学生成绩表(tb)如下:
姓名 课程 分数
张三 语文 74
张三 英语 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94
王五 计算机 86
王五 英语 90
想变成(得到如下结果):若出现
姓名 课程 分数
---- ---- ----
李四 英语 94
张三 物理 93
王五 英语 90
--------------
即把最大成绩取出来的SQL语句怎么写???create table cj(姓名 varchar(10) , 课程 varchar(10) , 分数 int);
insert into cj values('张三' , '语文' , 74);
insert into cj values('张三' , '英语' , 83);
insert into cj values('张三' , '物理' , 93);
insert into cj values('李四' , '语文' , 74);
insert into cj values('李四' , '数学' , 84);
insert into cj values('李四' , '物理' , 94);
insert into cj values('王五' , '计算机',80);
insert into cj values('王五' , '英语', 85);
姓名 课程 分数
张三 语文 74
张三 英语 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94
王五 计算机 86
王五 英语 90
想变成(得到如下结果):若出现
姓名 课程 分数
---- ---- ----
李四 英语 94
张三 物理 93
王五 英语 90
--------------
即把最大成绩取出来的SQL语句怎么写???create table cj(姓名 varchar(10) , 课程 varchar(10) , 分数 int);
insert into cj values('张三' , '语文' , 74);
insert into cj values('张三' , '英语' , 83);
insert into cj values('张三' , '物理' , 93);
insert into cj values('李四' , '语文' , 74);
insert into cj values('李四' , '数学' , 84);
insert into cj values('李四' , '物理' , 94);
insert into cj values('王五' , '计算机',80);
insert into cj values('王五' , '英语', 85);
*
from
tb t
where
分数=(select max(分数) from tb where 姓名=t.姓名)
from tb as a
join (select 姓名,max(分数) as 分数 from tb
group by 姓名) as b
on a.姓名=b.姓名 and a.分数=b.分数
insert into cj values('张三' , '语文' , 74);
insert into cj values('张三' , '英语' , 83);
insert into cj values('张三' , '物理' , 93);
insert into cj values('李四' , '语文' , 74);
insert into cj values('李四' , '数学' , 84);
insert into cj values('李四' , '物理' , 94);
insert into cj values('王五' , '计算机',80);
insert into cj values('王五' , '英语', 85);
select
*
from
cj t
where
分数=(select max(分数) from cj where 姓名=t.姓名)
/*姓名 课程 分数
---------- ---------- -----------
张三 物理 93
王五 英语 85
李四 物理 94(3 行受影响)
*/
create table cj(姓名 varchar(10) , 课程 varchar(10) , 分数 int);
insert into cj values('张三' , '语文' , 74);
insert into cj values('张三' , '英语' , 83);
insert into cj values('张三' , '物理' , 93);
insert into cj values('李四' , '语文' , 74);
insert into cj values('李四' , '数学' , 84);
insert into cj values('李四' , '物理' , 94);
insert into cj values('王五' , '计算机',80);
insert into cj values('王五' , '英语', 85);
go
select * from cj a where not exists (select 1 from cj where a.姓名=姓名 and 分数>a.分数)
go
drop table cj
go/*(1 行受影响)
姓名 课程 分数
---------- ---------- -----------
张三 物理 93
李四 物理 94
王五 英语 85(3 行受影响)
*/
select * from cj a where [分数]=
(select max([分数]) from cj b where b.[姓名] = a.[姓名] group by [姓名])
if object_id('tb') is not null drop table tb
go
create table tb([姓名] varchar(50),[课程] varchar(50),[分数] INT)
insert into tb
select '张三','语文',74 union all
select '张三','英语',83 union all
select '张三','物理',93 union all
select '李四','语文',74 union all
select '李四','数学',84 union all
select '李四','物理',94 union all
select '王五','计算机',86 union all
select '王五','英语',90
go
select * from tbselect * from tb t
where not exists(select 1 from tb where 姓名=t.姓名 and 分数 > t.分数)/*
姓名 课程 分数
------------- ---------- ----------
张三 物理 93
李四 物理 94
王五 英语 90
*/
(
select *,row_number() over(partition by 姓名 order by 分数 desc) as rn from tb
)
select 姓名,课程,分数 from cte where rn = 1/*
姓名 课程 分数
------------- ------------- -----------
李四 物理 94
王五 英语 90
张三 物理 93
*/
use tempdb
if object_id('tb') is not null drop table tb
go
create table tb([姓名] varchar(50),[课程] varchar(50),[分数] INT)
insert into tb
select '张三','语文',74 union all
select '张三','英语',93 union all
select '张三','物理',93 union all
select '李四','语文',74 union all
select '李四','数学',84 union all
select '李四','物理',94 union all
select '王五','计算机',86 union all
select '王五','英语',90
go;with cte as
(
select *,rank() over(partition by 姓名 order by 分数 desc) as rn from tb
)
select 姓名,课程,分数 from cte where rn = 1/*
姓名 课程 分数
------------- -------------- -----------
李四 物理 94
王五 英语 90
张三 英语 93
张三 物理 93
*/
select * from cj t where not exists(select 1 from cj where 姓名=t.姓名 and 分数>t.分数)
--sinpoal
if object_id('cj')is not null drop table cj
create table cj(姓名 varchar(10) , 课程 varchar(10) , 分数 int);
insert into cj values('张三' , '语文' , 74);
insert into cj values('张三' , '英语' , 83);
insert into cj values('张三' , '物理' , 93);
insert into cj values('李四' , '语文' , 74);
insert into cj values('李四' , '数学' , 84);
insert into cj values('李四' , '物理' , 94);
insert into cj values('王五' , '计算机',80);
insert into cj values('王五' , '英语', 85);
------sqlstatement--------
select * from cj jwhere 分数 in (select max(分数) from cj group by 姓名)
--------result---------
/*
姓名 课程 分数
---- ---- ----
张三 物理 93
李四 物理 94
王五 英语 85
-------------- */
*
from
tb t
where
分数=(select max(分数) from tb where 姓名=t.姓名)
from cj
where 分数 in(select max(分数) from cj group by 姓名)
order by 分数 desc
*
from
cj t
where
分数=(select max(分数) from cj where 姓名=t.姓名)
FROM cj t
WHERE (分数 =
(SELECT MAX(分数)
FROM cj
WHERE 姓名 = t.姓名))