| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5527 人关注过本帖
标题:按班级排名次问题
只看楼主 加入收藏
星光悠蓝
Rank: 9Rank: 9Rank: 9
来 自:山水甲天下
等 级:贵宾
威 望:52
帖 子:525
专家分:1278
注 册:2010-1-11
收藏
得分:0 
能不能用一个SQL语句完成?
2016-12-09 11:52
星光悠蓝
Rank: 9Rank: 9Rank: 9
来 自:山水甲天下
等 级:贵宾
威 望:52
帖 子:525
专家分:1278
注 册:2010-1-11
收藏
得分:0 
我运行的结果与tlliqi不一样,怎么回事
图片附件: 游客没有浏览图片的权限,请 登录注册
2016-12-09 11:59
andy292
Rank: 2
等 级:论坛游民
威 望:1
帖 子:86
专家分:13
注 册:2005-2-26
收藏
得分:0 
回复楼上:
你的是同分同名,但是值不加一
I=I+J
2016-12-09 22:04
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
回复 11楼 星光悠蓝
可以,如果数据量大,速度不理想。

坚守VFP最后的阵地
2016-12-09 23:57
andy292
Rank: 2
等 级:论坛游民
威 望:1
帖 子:86
专家分:13
注 册:2005-2-26
收藏
得分:0 
是啊,这个算法接近N立方了,是蛮吓人的速度
2016-12-10 11:48
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
回复 15楼 andy292
你表中数据有多少条

坚守VFP最后的阵地
2016-12-10 13:53
andy292
Rank: 2
等 级:论坛游民
威 望:1
帖 子:86
专家分:13
注 册:2005-2-26
收藏
得分:0 
一个年级1500人左右
2016-12-10 16:03
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 

坚守VFP最后的阵地
2016-12-10 16:18
星光悠蓝
Rank: 9Rank: 9Rank: 9
来 自:山水甲天下
等 级:贵宾
威 望:52
帖 子:525
专家分:1278
注 册:2010-1-11
收藏
得分:0 
1500条记录太少,十几万记录可能会花一点点时间,也可以忽略不计。
2016-12-10 17:15
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
请大家测试一下50W条记录运行时间是多少(在我的电脑上5-6秒,包括测试数据的生成)
程序代码:
T1=SECONDS()
CREATE CURSOR Cj (班级 C(5),姓名 C(10),总分 N(4),班级名次 N(6),年级名次 N(6))
=RAND(-1)
FOR I=1 TO 10000
    FOR J=1 TO 50
        INSERT INTO Cj (班级,姓名,总分) VALUES ("B"+PADL(I,4,"0"),SYS(2015),RAND()*100)
    ENDFOR
ENDFOR
INDEX ON 班级-STR(总分,4) TAG px DESCENDING
* 班级名次
mc=1 && 记录班级名次
nzf=0 && 记录上条记录的总分
cbj="" && 记录班级名称
nrs=1 && 记录班级人数
SCAN
    IF ALLTRIM(班级)!=cbj 
        STORE 1 TO nrs,mc
    ELSE
        IF 总分!=nzf
            mc=nrs
        ENDIF
    ENDIF
    REPLACE 班级名次 WITH mc
    nrs=nrs+1
    nzf=总分
    cbj=ALLTRIM(班级)
ENDSCAN
SET ORDER TO
* 年级名次
INDEX ON -总分 TO px
mc=0
nzf=0
nrs=1
SCAN
    IF 总分!=nzf
        mc=nrs
    ENDIF
    REPLACE 年级名次 WITH mc
    nrs=nrs+1
    nzf=总分
ENDSCAN
MESSAGEBOX("共运行:"+TRANSFORM(SECONDS()-t1)+" 秒")
BROWSE


[此贴子已经被作者于2016-12-14 08:48编辑过]


坚守VFP最后的阵地
2016-12-10 17:53
快速回复:按班级排名次问题
数据加载中...
 
   



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

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