标题:vfp用sql如何取出每个班中的前3名
只看楼主
bccn201203
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:3
帖 子:680
专家分:1140
注 册:2012-3-14
得分:0 
可能是只取前面三名的缘故吧(如果有4人并列,也只取前面三个人的成绩)
2013-03-17 18:18
bccn201203
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:3
帖 子:680
专家分:1140
注 册:2012-3-14
得分:0 
如果改为 2>= 取结果为前面3个人的成绩
如果改为 3>= 取结果为前面4个人的成绩
如果改为 4>= 取结果为前面5个人的成绩
以此类推
2013-03-17 18:21
kiff
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:广州
等 级:贵宾
威 望:46
帖 子:756
专家分:2531
注 册:2013-1-30
得分:0 
如真要一条SQL,但有点长
SELECT a.* FROM (select *,RECNO() id FROM (SELECT * FROM cj ORDER BY 班别,成绩 desc) d1) a,(SELECT 班别,MIN(id) id FROM (select *,RECNO() id FROM (SELECT * FROM cj ORDER BY 班别,成绩 desc) d2) D3 GROUP BY 班别 )  b WHERE a.班别==b.班别 AND a.id<=b.id+2

如果觉得长,也可以分成2条SQL
select *,RECNO() id FROM (SELECT * FROM cj ORDER BY 班别,成绩 desc) d1 INTO CURSOR cj_tmp
SELECT a.* FROM cj_tmp a,(SELECT 班别,MIN(id) id FROM cj_tmp GROUP BY 班别) b  WHERE a.班别==b.班别 AND a.id<=b.id+2


[ 本帖最后由 kiff 于 2013-3-17 19:22 编辑 ]
收到的鲜花
  • tlliqi2013-03-17 20:06 送鲜花  20朵   附言:很不错
2013-03-17 19:05
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
得分:0 
问题的症结找到了:就出在“3>=”这个上面。如果第二名有3个人并列,加上第一名就超过3个了。这时,嵌套子查询中的count(*)值将不满足<=3的条件,于是,就将应该满足条件的第三名记录给过滤掉了。也就是说,第一、二名的总人数不能超过3人;同理,如果第一名有超过4个人并列,第二名也会查询不出。
以上测试的结论证明:该命令有bug,还是我6楼的那个复杂查询相对准确些。
2013-03-17 19:14
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
得分:0 
以下是引用kiff在2013-3-17 19:05:53的发言:

如真要一条SQL,但有点长
SELECT a.* FROM (select *,RECNO() id FROM (SELECT * FROM cj ORDER BY 班别,成绩 desc) d1) a,(SELECT 班别,MIN(id) id FROM (select *,RECNO() id FROM (SELECT * FROM cj ORDER BY 班别,成绩 desc) d2) D3 GROUP BY 班别 )  b WHERE a.班别==b.班别 AND a.id<=b.id+2

如果觉长,也可以分成2条SQL
这条语句也只能查询出前3人,而不是前3名。而且,还不如18楼的代码简洁易懂。
2013-03-17 19:17
kiff
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:广州
等 级:贵宾
威 望:46
帖 子:756
专家分:2531
注 册:2013-1-30
得分:0 
以下是引用taifu945在2013-3-17 19:17:32的发言:

这条语句也只能查询出前3人,而不是前3名。而且,还不如18楼的代码简洁易懂。
是排序前3名

[ 本帖最后由 kiff 于 2013-3-17 19:26 编辑 ]
2013-03-17 19:23
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
得分:0 
以下是引用kiff在2013-3-17 19:23:13的发言:

是排序前3名

楼主的要求是前3个人,但正如2楼所说,前3人和前3名是不同的概念。我在6楼的代码是人、名通吃,而只需要前3人的代码我觉得18楼显然更简洁、易懂(子查询越多,代码就越生涩)。
2013-03-17 19:29
kiff
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:广州
等 级:贵宾
威 望:46
帖 子:756
专家分:2531
注 册:2013-1-30
得分:0 
以下是引用taifu945在2013-3-17 19:29:45的发言:


楼主的要求是前3个人,但正如2楼所说,前3人和前3名是不同的概念。我在6楼的代码是人、名通吃,而只需要前3人的代码我觉得18楼显然更简洁、易懂(子查询越多,代码就越生涩)。
我只理解为排序前3名,其它情况我不再讨论,觉得从数据库,按某班取出前3记录,无实际意义
2013-03-17 19:36
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
得分:0 
以下是引用kiff在2013-3-17 19:36:37的发言:

我只理解为排序前3名,其它情况我不再讨论,觉得从数据库,按某班取出前3记录,无实际意义
你不在学校工作的吧?我在学校工作,所以,我认为这种查询是经常要碰到的。比如,为评奖学金作参考。再者,我说了,即便只查询出前3人,而不是前3名,18楼的代码也更简洁、易懂,也更易维护。


[ 本帖最后由 taifu945 于 2013-3-17 19:39 编辑 ]
2013-03-17 19:38
kiff
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:广州
等 级:贵宾
威 望:46
帖 子:756
专家分:2531
注 册:2013-1-30
得分:0 
以下是引用taifu945在2013-3-17 19:29:45的发言:


楼主的要求是前3个人,但正如2楼所说,前3人和前3名是不同的概念。我在6楼的代码是人、名通吃,而只需要前3人的代码我觉得18楼显然更简洁、易懂(子查询越多,代码就越生涩)。
我看了一下你的回复,有时你说前3人,有时又前3名

现我重新定义一下:
1、前3人 --DBF 表 每班的前3条记录(不管成绩高低)。
2、前3名--每班按成绩由高到低排序后,取前3名称(不考虑同成绩因素)

你觉得楼主的意思是取哪一种? 而我以下语句结果又是哪一种?
SELECT a.* FROM (select *,RECNO() id FROM (SELECT * FROM cj ORDER BY 班别,成绩 desc) d1) a,(SELECT 班别,MIN(id) id FROM (select *,RECNO() id FROM (SELECT * FROM cj ORDER BY 班别,成绩 desc) d2) D3 GROUP BY 班别 )  b WHERE a.班别==b.班别 AND a.id<=b.id+2

(我的答案就是 第 2 种情况)

[ 本帖最后由 kiff 于 2013-3-18 08:57 编辑 ]
2013-03-17 20:06



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-401080-1-1.html




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

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