同分同名次示例
程序代码:* VFP9代码
SET SAFETY OFF
SET COLLATE TO "MACHINE"
=SYS(3099,70)
cStr="班级,总分,语文,数学,英语,物理,化学,生物,历史,地理,政治"
=ALINES(azdm,cStr,",")
nbj=50
CREATE CURSOR cj (bjh c(2),xh c(6),km c(4),kmbh n(2),cj n(4)) && bjh:班级编号,xh:学号,km:科目,kmbh:科目编号 排序时用
* 生成测试数据
=RAND(-1)
FOR i=1 TO nbj && 班级
FOR ii=3 TO ALEN(azdm,1) && 科目
FOR iii=1 TO 60 && 每个班60人
INSERT INTO cj VALUES (PADL(i,2,"0"),PADL(i,2,"0")+PADL(iii,4,"0"),azdm[ii],ii-1,RAND()*IIF(BETWEEN(ii,3,5),150,60))
ENDFOR
ENDFOR
ENDFOR
*!* 数据处理
t1=SECONDS()
SELECT *,0000 bjmc,00000 njmc FROM cj ORDER BY bjh,kmbh,cj DESC INTO CURSOR mc READWRITE
*!* 按照bjh、kmbh排班级名次
nbj="" && 记录班级号
ckm="" && 记录km(科目)名称
mc=1 && 记录班级名次
ncj=0 && 记录上条记录的cj
nrs=1 && 记录班级单科人数
*BROWSE
SCAN
IF bjh!=nbj
STORE 1 TO nrs,mc
ELSE
IF km!=ckm
STORE 1 TO nrs,mc
ENDIF
IF cj!=ncj
mc=nrs
ENDIF
ENDIF
REPLACE bjmc WITH mc
nrs=nrs+1
ncj=cj
nbj=bjh
ckm=km
ENDSCAN
*BROWSE
*!* 按照km(科目)、cj(成绩)排年级名次
INDEX ON km+str(cj) Tag px descending
mc=0 && 记录KM年级名次
ncj=0 && 记录上条记录成绩
nrs=1 && 记录单科科目的人数
ckm="" && 记录上条记录的科目
SCAN
IF km!=ckm
STORE 1 TO nrs,mc
ELSE
IF cj!=ncj
mc=nrs
ENDIF
ENDIF
REPLACE njmc WITH mc
nrs=nrs+1
ncj=cj
ckm=km
ENDSCAN
SET ORDER TO
MESSAGEBOX(TRANSFORM(RECCOUNT("mc"))+" 条记录共运行:"+TRANSFORM(SECONDS()-t1)+"秒")
GO TOP
BROWSE








