一个表:
学生 科目 成绩
张三 数学 99
张三 语文 80
张三 英语 66
李四 数学 80
李四 语文 88
李四 英语 98
王五 数学 56
王五 语文 65
王五 英语 77
现要查询出各科目最高分的记录:
张三 数学 99
李四 语文 88
李四 英语 98
学生 科目 成绩
张三 数学 99
张三 语文 80
张三 英语 66
李四 数学 80
李四 语文 88
李四 英语 98
王五 数学 56
王五 语文 65
王五 英语 77
现要查询出各科目最高分的记录:
张三 数学 99
李四 语文 88
李四 英语 98
*
from
tb t
where
not exists(select 1 from tb where 科目=t.科目 and 成绩>t.成绩)
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([学生] varchar(4),[科目] varchar(4),[成绩] int)
insert [tb]
select '张三','数学',99 union all
select '张三','语文',80 union all
select '张三','英语',66 union all
select '李四','数学',80 union all
select '李四','语文',88 union all
select '李四','英语',98 union all
select '王五','数学',56 union all
select '王五','语文',65 union all
select '王五','英语',77
---查询---
select
*
from
tb t
where
not exists(select 1 from tb where 科目=t.科目 and 成绩>t.成绩)
---结果---
学生 科目 成绩
---- ---- -----------
张三 数学 99
李四 语文 88
李四 英语 98(所影响的行数为 3 行)
INSERT @TB
SELECT N'张三', N'数学', 99 UNION ALL
SELECT N'张三', N'语文', 80 UNION ALL
SELECT N'张三', N'英语', 66 UNION ALL
SELECT N'李四', N'数学', 80 UNION ALL
SELECT N'李四', N'语文', 88 UNION ALL
SELECT N'李四', N'英语', 98 UNION ALL
SELECT N'王五', N'数学', 56 UNION ALL
SELECT N'王五', N'语文', 65 UNION ALL
SELECT N'王五', N'英语', 77SELECT A.*
FROM @TB AS A JOIN (
SELECT *,RANK=DENSE_RANK() OVER (PARTITION BY [科目] ORDER BY [成绩] DESC) FROM @TB
) B
ON A.[学生]=B.[学生] AND A.[科目]=B.[科目] AND A.[成绩]=B.[成绩]
WHERE RANK=1
/*
学生 科目 成绩
---- ---- -----------
张三 数学 99
李四 语文 88
李四 英语 98
*/
select
*
from
tb A
where
not exists(select * from tb where 科目=A.科目 and 成绩 > A.成绩)
create table [TBTEST]([学生] varchar(4),[科目] varchar(4),[成绩] int)
insert [TBTEST]
select '张三','数学',99 union all
select '张三','语文',80 union all
select '张三','英语',66 union all
select '李四','数学',80 union all
select '李四','语文',88 union all
select '李四','英语',98 union all
select '王五','数学',56 union all
select '王五','语文',65 union all
select '王五','英语',77SELECT T.* FROM TBTEST T ,(SELECT 科目,MAX(成绩) 成绩 FROM TBTEST GROUP BY 科目)AS T1
WHERE T.科目=T1.科目 AND T1.成绩=T.成绩 ORDER BY 1 DESC张三 数学 99
李四 语文 88
李四 英语 98