| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 13167 人关注过本帖
标题:如何查找每个班级总成绩前3名的学生?
只看楼主 加入收藏
nic
Rank: 2
等 级:新手上路
威 望:4
帖 子:175
专家分:0
注 册:2005-11-1
收藏
 问题点数:0 回复次数:10 
如何查找每个班级总成绩前3名的学生?


学生成绩表CJ
学号 总成绩 班级
1 300 1
2 250 1
3 360 1
4 450 1
.........
101 450 2
102 550 2
103 650 2
104 500 2
..........
201 678 3
202 340 3
203 434 3
204 800 3
................

如何把各班级总成绩前3名都列出来(在一次查询后都体现出来)

搜索更多相关主题的帖子: 总成绩 学生 学号 
2005-12-09 12:37
volte
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:69
帖 子:1167
专家分:1316
注 册:2004-12-19
收藏
得分:0 
select top3 *

from cj

order by 总成绩 desc

where 班级=你要查询的条件

如果你要一步实现的话,我估计要用到if ....else....语句

那个我相信你应该可以实现的

大家都是朋友,有空就来坐坐!
2005-12-10 13:56
LouisXIV
Rank: 6Rank: 6
等 级:贵宾
威 望:25
帖 子:789
专家分:0
注 册:2006-1-5
收藏
得分:0 
top 3有可能会出点问题
如果第三名同分的话,并列第三并不会出现。
应该用子查询来做比较好。

2006-02-18 14:43
LouisXIV
Rank: 6Rank: 6
等 级:贵宾
威 望:25
帖 子:789
专家分:0
注 册:2006-1-5
收藏
得分:0 
select *
from 学生成绩表CJ t1
where
(select count(*)
from 学生成绩表CJ t2
where t1.总成绩<t2.总成绩
and t1.班级=t2.班级)<3
order by 班级,总成绩 desc

个人觉得这样算是比较完善的

2006-02-18 15:18
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 

select *
from 学生成绩表CJ
order by 总成绩 desc
limit 3;


自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2006-02-19 08:46
LouisXIV
Rank: 6Rank: 6
等 级:贵宾
威 望:25
帖 子:789
专家分:0
注 册:2006-1-5
收藏
得分:0 
楼上的,Transact-SQL里有limit这样的函数吗?

2006-02-19 15:26
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 
这个在标准SQL 里是支持的,在MS-SQL我刚才查了以下,没查到。你自己试试不就知道了。我用的是MySql,是可以的。
我学SQL 也不久,没什么经验。我学了一阵以后,突然在想,有些东西不大对头,人类的思想是不是有点问题,为什么要用这种SQL语句把思维方式固定死呢? 我更愿意用另一种方式来表达我的思想,比如这道题,我想这样表达我的思想:

1) 将学生成绩表排序,降序方式
2) 取出前3个记录。

这样是不是更直观些?

这样的话更像是在编程,其实这样的做法完全可以实现的。当你在console 黑屏幕下输入代码的时候, 你是在编程, 一种直观的表达, 这种思维方式与 现今的SQL方式是完全不同的, 我有一种直觉, 如果这种解释器能够研制成功的话, SQL 将被淘汰.

不知道, 我的想法你是否理解了, 我来举个复杂一点的题, 那就是那道求各班级前十名的题, 这道题的SQL 的命令怎么写, 我还想不出来, 但是如果用我的方式那么会变得很简单, 我的想法是这样的.

假设你有两个表, 一个为班级的表, 它只有一个 attribute: classID
另一个表为学生, 它的attribute 为: pupilID, classID, name, score
那么算法是这样的,
1) 在学生表中根据 classID 建立 subSet 的 集合
2) 依次对subSet 排序 (降序)
3) 从各个subSet 中取出前10名

那么代码会是这样的,
Vector v = null, // 一个容器变量, 用于函数返回值
v = createSubset(classID), // 现在已经根据 classID 建立了一系列的subSet, 并放在了一个 tempVector 中,
// 将这个tempVector 赋值给 v, 以便下面操作
for(int i = 0; i<v.size(); i++)
{
((Set) v.elementAt(i) ).sort(Sort.DESC); // 排序
((Set) v.elementAt(i) ).displayAll(0, 9); // 及时输出, 从第一位到第十位
}

题外话,
我学了一些编程语言, 于是在想一个问题, 为什么有些语言不能成为语言, 从另一个角度来说就是那些成为主流语言的编程语言到底是什么受到人们的青睐, 也就是说肯定有某种因素在起作用.

我发现, 区别于主流语言和非主流语言的一个关键之处在于这么一个概念, 用一个单词来说就是: 分布式
主流语言支持 分布式思维方式, 非主流语言大多不支持. 而分布式思维方式是一种开放性的, 多维的, 自由的思维方式, 而非分布式的思维方式是一种封闭式的, 固定模式化式的, 需要技巧支持的思维方式. 比如Sql 询问语言, 还比如Lisp, Scheme 语言等.




自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2006-02-19 19:13
LouisXIV
Rank: 6Rank: 6
等 级:贵宾
威 望:25
帖 子:789
专家分:0
注 册:2006-1-5
收藏
得分:0 

首先对你打了这么多字先感谢一下。
不过不知道你所说的标准sql是指哪个? 我在6楼发言前已经确认过limit不能通过sql的compling,并且为了进一步确认,还查过了Online Book。或许mysql确实可以通过(没有用过,没有发言权),不过这里是SQL Sever子论坛,还是应该以MS-SQL为标准才是,你说呢?
SQL查询语句的精髓(个人觉得)在于子查询(subquery),没有掌握子查询的话根本不能算入了sql门,就如你所列的问题(或许你认为很复杂了),只要把我4楼贴的稍微改一下就可以了

select *
from 学生成绩表CJ t1
where
(select count(*)
from 学生成绩表CJ t2
where t1.总成绩<t2.总成绩
and t1.班级=t2.班级)<10
order by 班级,总成绩 desc

不知道你能不能看懂这个嵌套子查询的原理,如果考虑到年级条件的话,只要在子查询里在补充一个年级的where条件就可以了。这个查询同时考虑到了同点的问题。

很明显你对C语言很感兴趣(或者说热衷吧),我也承认学C语言的人很多(大学里被强制学了半年,半途而废,本人不是计算机专业)。但是一门语言是不是主流,并像你想的那样,主要还是根据其用途来分的,搞数据库的多数掌握的是sql和VB,还有ASP.NET等语言,据我所知,用C++的人并不多。那么我是不是可以说C++不是主流语言呢?显然不是这样的。SQL是为数据库而生的,Oracle,Access等都是基于sql语言的数据库。就这样的语言你要跟C++等比较的话你是否觉得有可比性?


2006-02-19 21:03
kai
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:52
帖 子:3450
专家分:59
注 册:2004-4-25
收藏
得分:0 
LouisXIV,
SQL 我确实在学习中, 尚未入门, 当我有了一个算法, 却还是表达不清楚, 或者说, 总觉得在表达上有点别扭.
我7楼的阐述中所写的代码确实类似于C/C++. 其实这只是逻辑的代码表达而已. 从逻辑的表达顺序上来讲, 我的表达是由上而下的, 这也是符合人的正常思维方式的, 我认为人的正常思维方式为递进式的,所谓递进式, 就是一个接着一个执行, 你从一个起点出发, 一步一步往前走, 你在当前这一步的时候, 你考虑你下一步该如何走, 或者说下一步应该发生什么, 如果某一步的操作所产生的状态需要在后续步骤中进一步操作, 那么我们就需要 变量来存储 这个状态, 这就是变量的作用.
如果思考一下SQL的逻辑方式, 你觉得是我所说的递进式的吗?
我们来看你8楼的代码:
select *
from 学生成绩表CJ t1
where
(select count(*)
from 学生成绩表CJ t2
where t1.总成绩<t2.总成绩
and t1.班级=t2.班级)<10
order by 班级,总成绩 desc

这是一种嵌进式的思维方式, 所谓嵌进式, 形象一点来讲好比你造房子, 你已经知道某个部位安装窗, 你造的时候把某个部位空着, 事后再来安窗. 在你的代码中那个 subquery 就好比那个窗, 而整体就是那个房子, 这种思维方式是尽量不需要存储中间状态的, 所以你几乎看不到变量的存在, 变量的存在是因为后续代码中需要用到, 既然后续代码发生在前序代码之前, 那么当然没有必要用什么变量了.

当今的数据库世界里, 的的确确采用的是SQL 语言, 虽说基于制造商的不同, sql的命令库也或多或少的有所不同, 比如那个 limit 函数. 通常学习的人, 也不会去想我所想的问题, 我也不明白,为什么全世界的人都没有像我这样从另一个角度来思考问题, 而是老老实实的跟着一块儿学. 当然我承认, SQL肯定能你所需要的询问, 以及建表等.

但是我这里所讨论的, 或者说我所观察的是语言的自由性. 自由这两个字的分量很重, 对于一门语言, 什么是自由性, 那就是这门语言提供了一种机制, 使得任何一种思维方式都能得以表述出来, 也就是说它不要求你局限于某种固定的思维方式.

当今世界有很多编程语言, 任何一门语言的出台都很大程度上受到了该语言设计者的思维方式的影响, 每个人都会有他自己所习惯的某种思维方式. 如果某种语言的能量很大, 但是却局限于某种思维方式, 也就是说限制了程序员的自由思维, 那么它必定不能成为主流语言.

你也许或问, 那为什么SQL 在数据库世界里成为无可动摇的标准? 我也觉得奇怪, 我想这或许与其从业人员占编程人数的比例不够大有关, 当然我也没有具体数据来说明.

我想应该会有一种语言来挑战SQL, 这种语言对你的思维方式不做约束. 比如通过这种语言可以写出我7楼的代码.

说些题外话, 之所以C/C++, Java 能成为当今的主流语言, 正是因为它是自由式语言, 只要你能在逻辑层面合理表达, 那么你就可以用 Java 来表达你的逻辑代码. 我这里没有说C/C++, 是因为C/C++ 是与操作系统无关的.

我们所学的仅仅是学了 how, 但不是 why. 我觉得如果你知道语言为什么是这样的, 那么你也许或考虑一下, 是不是它从一开始就错了. 或者说,他从一开始就注定成为一条小溪流, 虽然也美丽. 但却缺乏大海的能量.

自由,民主,平等,博爱,进步.
中华民国,我的祖国,中华民国万岁!中华民国加油!
本人自愿加入中国国民党,为人的自由性,独立性和平等性而奋斗!
2006-02-20 07:08
vatic
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2006-3-16
收藏
得分:0 
等待高人
2006-04-09 19:36
快速回复:如何查找每个班级总成绩前3名的学生?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016465 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved