回 帖 发 新 帖 刷新版面

主题:学生成绩排名


先解释一下字段含义
学号 :学生学号,随着新学生的加入而增加
学科min : 学生参加学科的最小编号,学生参加学科的编号必须是连续的,如123,2345,01,
学科max : 学生参加学科的最大编号,学生参加学科的编号必须是连续的,如123,2345,01,
学科门数 :学科总门数,学科门数=学科max-学科min+1,
学科编号 :具体某个学科,学科min<=学科编号<=学科max,
成绩 : 某个学科的成绩
tf : 是否参加成绩排名
a0~a160 : 昨天的某个学科的成绩,手工录入,a后面的数字就是学科编号

cj.dbf 是存放学生第一次到前天为止全部学科的以前成绩,相同的学科相同的成绩只记录一次

求参加成绩排名学生昨天所有参加学科的成绩在自己以前该学科成绩里的排名,
例如某学科以前成绩有 1,5,7,6,12,26,24,那么如果该学科昨天成绩
若是1则排名是7;
若是2则排名是7;
若是5则排名是6;
若是6则排名是5;
若是24则排名是2;
若是25则排名是2;
若是26则排名是1;
若是27则排名是1;
若是28则排名是1;

我自己写了一段,感觉不理想,运行速度太慢了,有没有更好更快的方法?
? time(1)
sele 3
use xh
sele 9
use cj
sele 8
use pm
dele all
pack
for rr=2 to recc(3)
sele 3
go rr
if tf='是'
scat fiel 学号 to bh
scat fiel 学科门数 to len1
scat fiel 学科min to min1
scat fiel 学科max to max1
for ee=val(min1) to val(max1)
eec='a'+allt(str(ee))
sele 3
scat fiel &eec to b&eec
sele 9
sort on 成绩/d to tmp_ylb for 学号=bh.and.学科编号=ltri(str(ee))
sele 91
use tmp_ylb
loca  for 成绩<=b&eec
paiming=recn()
use 
sele 8
appe blan
repl 学号 with bh,学科min with min1,学科max with max1,学科编号 with ltri(str(ee)),成绩 with b&eec,排名 with paiming
endf
endi
endf
inde on 排名 to tmp1
? time(1)
brow

回复列表 (共3个回复)

沙发

楼主的结果好像有误差,每个学号都显示了学科编号为0,1的排名.本该1157行结果的排名有2134行了.
E2200,2G内存运行了两分半钟.

这是我测试的语句,1157行结果:
Clea
Clea All
Sele 1
Use xh
Sele 2
Use cj

SELECT C.学号,C.学科MIN,C.学科MAX,C.XKBH AS 学科编号,(SELECT COUNT(*) FROM CJ B WHERE C.学号=B.学号 AND C.XKBH==B.学科编号 AND C.CJ<=B.成绩) AS 排名,C.CJ AS 成绩 FROM (SELECT A.学号,A.学科MIN,A.学科MAX,ICASE(A0<>0,'0',A1<>0,'1',A2<>0,'2','-1') AS XKBH,ICASE(A0<>0,A0,A1<>0,A1,A2<>0,A2,-1) AS CJ FROM XH A  WHERE A.Tf='是') C INTO CURSOR PM

BROW

好像一秒不到.

xh表不好理解,为什么不直接记录学科编号和成绩?

板凳

我的结果肯定是对的,参加成绩排名的记录一共有1157个,全部都参加了2个学科,那么1157*2=2314
我这次选参加成绩排名的记录都是加了2个学科,但下次就不是了,有参加2个学科的,也有参加10个学科的,或者..............就是说参加成绩排名的学科门数是不确定的不全部相同的,学科min 字段的范围0--1000,学科max 字段的范围0--1000,
如果能用SELECT 语句就好了,可是我不会,只懂老fox哦[em10]

3 楼

先不说几个学科参加排序,就单个表来说1000个字段怎么做?

再猜测下,你的学科min,学科min是用来计算参加排序的有几个学科(一天一个学生登记了几个学科成绩).

如果是这样,这个表可以和cj表一样的结构设计,学号,学科编号,成绩,有这几个就可以比较了.

看你最前面的一贴,好像不是学生成绩吧?服装类的?

我来回复

您尚未登录,请登录后再回复。点此登录或注册