| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4217 人关注过本帖, 2 人收藏
标题:成绩排名 程序优化
只看楼主 加入收藏
szy345
Rank: 4
来 自:江苏——南京
等 级:贵宾
威 望:14
帖 子:336
专家分:14
注 册:2008-8-6
结帖率:100%
收藏(2)
 问题点数:0 回复次数:24 
成绩排名 程序优化
成绩排名程序,可否再进行优化,或者哪位还有更通俗易懂的:
表: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

[[it] 本帖最后由 szy345 于 2008-9-12 15:19 编辑 [/it]]
搜索更多相关主题的帖子: 程序优化 排名 
2008-09-12 15:18
qjbzjp
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:尧的故乡
等 级:贵宾
威 望:48
帖 子:1914
专家分:4397
注 册:2007-3-14
收藏
得分:0 
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-09-12 16:20
szy345
Rank: 4
来 自:江苏——南京
等 级:贵宾
威 望:14
帖 子:336
专家分:14
注 册:2008-8-6
收藏
得分:0 
楼上的可能要再改改,有点小问题
    CJ  PM
    85   1
    84   2
    84   2
    83   4
2个84并列第2,那么83就应该是第4名了,而不是第3名
2008-09-12 16:56
qjbzjp
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:尧的故乡
等 级:贵宾
威 望:48
帖 子:1914
专家分:4397
注 册:2007-3-14
收藏
得分:0 
不要第3名吗?那就是说如果有好几个同分数的,就会缺少好几个名次了?
2008-09-12 17:02
qjbzjp
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:尧的故乡
等 级:贵宾
威 望:48
帖 子:1914
专家分:4397
注 册:2007-3-14
收藏
得分:0 
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-09-12 18:52
iadmirevancogh
Rank: 1
等 级:新手上路
帖 子:59
专家分:0
注 册:2007-12-18
收藏
得分:0 
ding !学习了!!!
2008-09-12 21:03
szy345
Rank: 4
来 自:江苏——南京
等 级:贵宾
威 望:14
帖 子:336
专家分:14
注 册:2008-8-6
收藏
得分:0 
[bo][un]qjbzjp[/un] 在 2008/9/12 18:52 的发言:[/bo]


    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-09-12 21:17
ibmlang_002
Rank: 5Rank: 5
来 自:浙江-嘉兴
等 级:贵宾
威 望:18
帖 子:437
专家分:176
注 册:2008-8-30
收藏
得分:0 
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 排名表

[[it] 本帖最后由 ibmlang_002 于 2008-9-12 22:45 编辑 [/it]]
2008-09-12 22:42
qjbzjp
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:尧的故乡
等 级:贵宾
威 望:48
帖 子:1914
专家分:4397
注 册:2007-3-14
收藏
得分:0 
用ibmlang_002 的SQL代码效率更高!学习了!

不过与楼主探讨,既然是排名,有空下的名次好像也不妥?
比如奥运会运动项目中,如果有并列第二名,也不可能不要第三名了。
2008-09-13 10:15
szy345
Rank: 4
来 自:江苏——南京
等 级:贵宾
威 望:14
帖 子:336
专家分:14
注 册:2008-8-6
收藏
得分:0 
只是各个项目的要求不同。
没有什么硬性的规定。
2008-09-13 11:52
快速回复:成绩排名 程序优化
数据加载中...
 
   



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

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