buguge - Keep it simple,stupid

知识就是力量,但更重要的,是运用知识的能力why buguge?

导航

求成绩表中各门课程前三名

create table #(student varchar(10), class varchar(10), score decimal(9,2)
) ON [PRIMARY]

insert # values('A', 'C1', 100)
insert # values('B', 'C1', 80)
insert # values('C', 'C1', 70)
insert # values('E', 'C1', 70)
insert # values('D', 'C1', 60)
insert # values('A', 'C3', 100)

select * from # a where score in(select top 3 score from # where class=a.class order by score desc)

查询结果:

 
student class   score
A C1 100
B C1   80
C C1 70
E C1 70
A C3 100

 

一个同事给的sql是:

select * from # a where student in(select top 3 student from # where class=a.class order by score desc)

 即判断条件依据的是student字段。 查询结果为:

 
student class   score
A C1 100
B C1   80
E C1 70
A C3 100

可以看出来它们的区别:如果筛选结果有相同成绩的, 前者会全部显示出来,即所谓的并列名次。 而后者,仅取了其中的一条记录。

不太明白的是:为什么C1课程的第三名学生是E,而不是C?


如果为临时表创建索引,即

create table #(student varchar(10), class varchar(10), score decimal(9,2)
CONSTRAINT [PK_tmp] PRIMARY KEY CLUSTERED 
(
	student asc,
	class asc
)
) ON [PRIMARY]

 则第三名学生为C

posted on 2012-03-05 15:43  buguge  阅读(373)  评论(0编辑  收藏  举报