Id 科目 成绩
1 语文 60
2 数学 85
3 语文 85
4 英语 96
5 化学 77
6 英语 50
7 物理 90
8 英语 85
列出最大前3不同分数的3条记录。比如96,90,85,但是有两条85的话要显示两条。显示的条数就是4条
1 语文 60
2 数学 85
3 语文 85
4 英语 96
5 化学 77
6 英语 50
7 物理 90
8 英语 85
列出最大前3不同分数的3条记录。比如96,90,85,但是有两条85的话要显示两条。显示的条数就是4条
where 成绩 in (select top 3 成绩 from T group by 成绩 order by 成绩 desc)
insert into t(id,科目,成绩)
select 1,'语文',60 union all
select 2,'数学',85 union all
select 3,'语文',85 union all
select 4,'英语',96 union all
select 5,'化学',77 union all
select 6,'英语',50 union all
select 7,'物理',90 union all
select 8,'英语',85select * from t where 成绩 in(select top 3 成绩 from t group by 成绩 order by 成绩 desc) order by 成绩 descdrop table t
drop table tb
gocreate table tb(Id int,科目 varchar(10),成绩 int)
insert into tb(Id,科目,成绩) values(1, '语文', '60')
insert into tb(Id,科目,成绩) values(2, '数学', '85')
insert into tb(Id,科目,成绩) values(3, '语文', '85')
insert into tb(Id,科目,成绩) values(4, '英语', '96')
insert into tb(Id,科目,成绩) values(5, '化学', '77')
insert into tb(Id,科目,成绩) values(6, '英语', '50')
insert into tb(Id,科目,成绩) values(7, '物理', '90')
insert into tb(Id,科目,成绩) values(8, '英语', '85')
go
select * from
(
SELECT *,Place=(SELECT COUNT(DISTINCT 成绩) FROM tb WHERE 成绩 >= a.成绩)
FROM tb a
) t
where place <= 3
ORDER BY 成绩 descdrop table tb
/*
Id 科目 成绩 Place
----------- ---------- ----------- -----------
4 英语 96 1
7 物理 90 2
2 数学 85 3
3 语文 85 3
8 英语 85 3(所影响的行数为 5 行)
*/
写的说是效率太低.说用什么set rowcount来实现.也具体没听清.如果是set rowcount怎么实现呢。
select t.*, rank() over(order by 成绩 desc) as rank from t )
select * from test
where rank <= 3试试这个办法