| 编程中国 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛
全能ASP/PHP/ASP.NET主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付买域名,送MP3、MP4
高端软件开发 = 年薪十万不是梦赛孚耐:软件保护加密专家身份认证令牌USB KEY买空间,免费送域名(厦门中资源)
共有 1182 人关注过本帖
标题:成绩排名 程序优化
收藏  订阅  推荐  打印 
szy345
Rank: 12Rank: 12Rank: 12
来自:江苏——南京
等级:版主
威望:6
帖子:222
积分:2680
注册:2008-8-6
成绩排名 程序优化

成绩排名程序,可否再进行优化,或者哪位还有更通俗易懂的:
表:CJ   PM
    85   1
    84   2
    84   2
    83   4
    。。。。


public w_max,n,i
n=1    && 成绩相同的人数
i=0    && 排名序号

select cjk
set order to cj
go top

w_max = cjk.cj
repl pm with n+i
skip    
    do while !eof()
    if w_max = cjk.cj
             n = n + 1
    else
        if n>0
           i = i + n + 1
           n = 0
        else
           i = i + 1
        endif
    endif

    repl pm with i
    w_max = cjk.cj
    skip
    enddo

[ 本帖最后由 szy345 于 2008-9-12 15:19 编辑 ]
搜索更多相关主题的帖子: 程序优化  排名  
2008-9-12 15:18
qjbzjp
Rank: 12Rank: 12Rank: 12
来自: 山西
等级:版主
威望:6
帖子:281
积分:3843
注册:2007-3-14

n=0
cjbak=0
USE cjk
INDEX ON cj to cj
SET ORDER TO cj DESCENDING
GO top
FOR i=1 to RECCOUNT()
    n=IIF(cjbak=cj,n,n+1)
    REPLACE pm with n
    cjbak=cj
    skip
next
2008-9-12 16:20
szy345
Rank: 12Rank: 12Rank: 12
来自:江苏——南京
等级:版主
威望:6
帖子:222
积分:2680
注册:2008-8-6

楼上的可能要再改改,有点小问题
    CJ  PM
    85   1
    84   2
    84   2
    83   4
2个84并列第2,那么83就应该是第4名了,而不是第3名
2008-9-12 16:56
qjbzjp
Rank: 12Rank: 12Rank: 12
来自: 山西
等级:版主
威望:6
帖子:281
积分:3843
注册:2007-3-14

不要第3名吗?那就是说如果有好几个同分数的,就会缺少好几个名次了?
2008-9-12 17:02
qjbzjp
Rank: 12Rank: 12Rank: 12
来自: 山西
等级:版主
威望:6
帖子:281
积分:3843
注册:2007-3-14

n=0
cjbak=0
USE cjk
INDEX ON cj to cj
SET ORDER TO cj DESCENDING
GO top
FOR i=1 to RECCOUNT()
    n=IIF(cj=cjbak,i-1,i)
    REPLACE pm with n
    cjbak=cj
    skip
next
2008-9-12 18:52
iadmirevancogh
Rank: 2
等级:注册会员
帖子:47
积分:586
注册:2007-12-18

ding !学习了!!!
2008-9-12 21:03
szy345
Rank: 12Rank: 12Rank: 12
来自:江苏——南京
等级:版主
威望:6
帖子:222
积分:2680
注册:2008-8-6

qjbzjp 在 2008/9/12 18:52 的发言:


    n=IIF(cj=cjbak,i-1,i)
    REPLACE pm with n
这2句还是有点问题:

CJ  PM       i值   cj=cjbak  n值
84  1         1       F       1
83  2         2       F       2
83  2         3       T       2
83  2         4       T     (i-1)=3   
82  5         5       F       5
2008-9-12 21:17
ibmlang_002
Rank: 12Rank: 12Rank: 12
来自:浙江-嘉兴
等级:版主
威望:6
帖子:304
积分:3735
注册:2008-8-30

SELECT cj,COUNT(*) as co FROM cj GROUP BY cj ORDER  BY cj DESC  INTO TABLE  temp
ALTER TABLE temp ADD COLUMN pm n(2)
a=0
b=1
FOR i=1 TO RECCOUNT()
REPLACE pm WITH a+b
a=co
b=pm
SKIP
ENDFOR
SELECT cj.cj,temp.pm FROM cj,temp WHERE cj.cj=temp.cj ORDER BY cj.cj DESC into table 排名表

[ 本帖最后由 ibmlang_002 于 2008-9-12 22:45 编辑 ]
2008-9-12 22:42
qjbzjp
Rank: 12Rank: 12Rank: 12
来自: 山西
等级:版主
威望:6
帖子:281
积分:3843
注册:2007-3-14

用ibmlang_002 的SQL代码效率更高!学习了!

不过与楼主探讨,既然是排名,有空下的名次好像也不妥?
比如奥运会运动项目中,如果有并列第二名,也不可能不要第三名了。
2008-9-13 10:15
szy345
Rank: 12Rank: 12Rank: 12
来自:江苏——南京
等级:版主
威望:6
帖子:222
积分:2680
注册:2008-8-6

只是各个项目的要求不同。
没有什么硬性的规定。
2008-9-13 11:52
关于我们 | 广告合作 | 编程中国 | 清除Cookies | Archiver | WAP | TOP

编程中国 版权所有,并保留所有权利。鲁ICP备08000592号
Powered by Discuz, Processed in 0.054209 second(s), 9 queries.
Copyright©2004-2008, BCCN.NET, All Rights Reserved