| 网站首页 | 业界新闻 | 群组 | 交易 | 人才 | 下载频道 | 博客 | 代码贴 | 编程论坛
共有 1969 人关注过本帖
标题:同分同名次排名问题
只看楼主 加入收藏
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:173
帖 子:7426
专家分:17586
注 册:2012-2-5
  得分:0 
代码乱糟糟,看着头晕,这是JF表中数据汇总?
不管什么方法,能解决问题就是好方法。

[此贴子已经被作者于2017-10-28 18:00编辑过]


坚守VFP最后的阵地
2017-10-28 17:59
分号
Rank: 1
等 级:新手上路
帖 子:92
专家分:0
注 册:2006-12-4
  得分:0 
是的。积分的汇总。合计了各科总积分,排一下名次。按照类别。
2017-10-28 21:16
schtg
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:18
帖 子:527
专家分:691
注 册:2012-2-29
  得分:0 
试一试下面语句,可否满足你的要求(仅测试语文一科)?
UPDATE yclk SET ywnjmc=(select COUNT(a.bj)+1 from yclk as a WHERE a.语文>yclk.语文)  && 年级名次
UPDATE yclk SET ywbjmc=(select COUNT(a.bj)+1 from yclk as a WHERE a.语文>yclk.语文 AND a.bj=yclk.bj)  && 班级名次

[此贴子已经被作者于2017-10-29 06:32编辑过]

2017-10-29 06:27
分号
Rank: 1
等 级:新手上路
帖 子:92
专家分:0
注 册:2006-12-4
  得分:0 
是全科目。
2017-10-29 08:55
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:173
帖 子:7426
专家分:17586
注 册:2012-2-5
  得分:0 
回复 13楼 schtg
如果记录数超过4000条,这种语句速度比较慢,条件越多速度越慢

坚守VFP最后的阵地
2017-10-29 09:06
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:173
帖 子:7426
专家分:17586
注 册:2012-2-5
  得分:10 
单一科目同分同名次程序测试
程序代码:
* VFP9代码
create cursor tt (cj n(7),mc n(7))
=rand(-1)
for i=1 to 20000
    insert into tt (cj) values (rand()*100)
endfor
t1=SECONDS()
UPDATE tt SET mc=(select COUNT(*)+1 from tt as a WHERE a.cj>tt.cj)
MESSAGEBOX(TRANSFORM(RECCOUNT())+"条记录SQL命令运行:"+TRANSFORM(SECONDS()-t1)+" 秒")
SELECT tt
browse

REPLACE mc WITH 0 ALL
t1=SECONDS()
SELECT tt
INDEX on -cj TO mc
STORE 1 TO nmc,nrs
ncj=0
SCAN
    IF cj!=ncj
        nmc=nrs
    ENDIF
    REPLACE mc WITH nmc
    nrs=nrs+1
    ncj=cj
    nmc=mc
ENDSCAN

MESSAGEBOX(TRANSFORM(RECCOUNT())+"条记录VFP命令运行:"+TRANSFORM(SECONDS()-t1)+" 秒")

坚守VFP最后的阵地
2017-10-29 09:50
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:173
帖 子:7426
专家分:17586
注 册:2012-2-5
  得分:0 
VFP命令的好处在于,经过SCAN ENDSCAN扫描一次,所有科目名次结果可以一次出来,且效率高,而SQL命令要做到这一点是很困难的,也可能我的SQL水平是菜鸟水平。

坚守VFP最后的阵地
2017-10-29 09:56
schtg
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:18
帖 子:527
专家分:691
注 册:2012-2-29
  得分:0 
回复 15楼 sdta
谢谢,我绝对相信SDTA大侠的说法,我平时仅限小数据分析,所以使用这句的时候较多,受益,非常感谢!
2017-10-29 13:41
分号
Rank: 1
等 级:新手上路
帖 子:92
专家分:0
注 册:2006-12-4
  得分:0 
程序代码:
UPDATE g2 SET ywnjmc=(select COUNT(a.bj)+1 from g2 as a WHERE a.语文>g2.语文)  && 年级名次
UPDATE g2 SET sxnjmc=(select COUNT(a.bj)+1 from g2 as a WHERE a.数学>g2.数学)  && 年级名次
UPDATE g2 SET yynjmc=(select COUNT(a.bj)+1 from g2 as a WHERE a.英语>g2.英语)  && 年级名次
UPDATE g2 SET sznjmc=(select COUNT(a.bj)+1 from g2 as a WHERE a.三总>g2.三总)  && 年级名次
UPDATE g2 SET wlnjmc=(select COUNT(a.bj)+1 from g2 as a WHERE a.物理>g2.物理)  && 年级名次
UPDATE g2 SET hxnjmc=(select COUNT(a.bj)+1 from g2 as a WHERE a.化学>g2.化学)  && 年级名次
UPDATE g2 SET swnjmc=(select COUNT(a.bj)+1 from g2 as a WHERE a.生物>g2.生物)  && 年级名次
UPDATE g2 SET zfnjmc=(select COUNT(a.bj)+1 from g2 as a WHERE a.总分>g2.总分)  && 年级名次


UPDATE g2 SET ywbjmc=(select COUNT(a.bj)+1 from g2 as a WHERE a.语文>g2.语文 AND a.bj=g2.bj)  && 班级名次
UPDATE g2 SET sxbjmc=(select COUNT(a.bj)+1 from g2 as a WHERE a.数学>g2.数学 AND a.bj=g2.bj)  && 班级名次
UPDATE g2 SET yybjmc=(select COUNT(a.bj)+1 from g2 as a WHERE a.英语>g2.英语 AND a.bj=g2.bj)  && 班级名次
UPDATE g2 SET szbjmc=(select COUNT(a.bj)+1 from g2 as a WHERE a.三总>g2.三总 AND a.bj=g2.bj)  && 班级名次
UPDATE g2 SET wlbjmc=(select COUNT(a.bj)+1 from g2 as a WHERE a.物理>g2.物理 AND a.bj=g2.bj)  && 班级名次
UPDATE g2 SET hxbjmc=(select COUNT(a.bj)+1 from g2 as a WHERE a.化学>g2.化学 AND a.bj=g2.bj)  && 班级名次
UPDATE g2 SET swbjmc=(select COUNT(a.bj)+1 from g2 as a WHERE a.生物>g2.生物 AND a.bj=g2.bj)  && 班级名次
UPDATE g2 SET zfbjmc=(select COUNT(a.bj)+1 from g2 as a WHERE a.总分>g2.总分 AND a.bj=g2.bj)  && 班级名次



这样也能达到目的。
2017-11-06 09:40
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:173
帖 子:7426
专家分:17586
注 册:2012-2-5
  得分:0 
以下是引用分号在2017-11-6 09:40:34的发言:

UPDATE g2 SET ywnjmc=(select COUNT(a.bj)+1 from g2 as a WHERE a.语文>g2.语文)  && 年级名次
UPDATE g2 SET sxnjmc=(select COUNT(a.bj)+1 from g2 as a WHERE a.数学>g2.数学)  && 年级名次
UPDATE g2 SET yynjmc=(select COUNT(a.bj)+1 from g2 as a WHERE a.英语>g2.英语)  && 年级名次
UPDATE g2 SET sznjmc=(select COUNT(a.bj)+1 from g2 as a WHERE a.三总>g2.三总)  && 年级名次
UPDATE g2 SET wlnjmc=(select COUNT(a.bj)+1 from g2 as a WHERE a.物理>g2.物理)  && 年级名次
UPDATE g2 SET hxnjmc=(select COUNT(a.bj)+1 from g2 as a WHERE a.化学>g2.化学)  && 年级名次
UPDATE g2 SET swnjmc=(select COUNT(a.bj)+1 from g2 as a WHERE a.生物>g2.生物)  && 年级名次
UPDATE g2 SET zfnjmc=(select COUNT(a.bj)+1 from g2 as a WHERE a.总分>g2.总分)  && 年级名次


UPDATE g2 SET ywbjmc=(select COUNT(a.bj)+1 from g2 as a WHERE a.语文>g2.语文 AND a.bj=g2.bj)  && 班级名次
UPDATE g2 SET sxbjmc=(select COUNT(a.bj)+1 from g2 as a WHERE a.数学>g2.数学 AND a.bj=g2.bj)  && 班级名次
UPDATE g2 SET yybjmc=(select COUNT(a.bj)+1 from g2 as a WHERE a.英语>g2.英语 AND a.bj=g2.bj)  && 班级名次
UPDATE g2 SET szbjmc=(select COUNT(a.bj)+1 from g2 as a WHERE a.三总>g2.三总 AND a.bj=g2.bj)  && 班级名次
UPDATE g2 SET wlbjmc=(select COUNT(a.bj)+1 from g2 as a WHERE a.物理>g2.物理 AND a.bj=g2.bj)  && 班级名次
UPDATE g2 SET hxbjmc=(select COUNT(a.bj)+1 from g2 as a WHERE a.化学>g2.化学 AND a.bj=g2.bj)  && 班级名次
UPDATE g2 SET swbjmc=(select COUNT(a.bj)+1 from g2 as a WHERE a.生物>g2.生物 AND a.bj=g2.bj)  && 班级名次
UPDATE g2 SET zfbjmc=(select COUNT(a.bj)+1 from g2 as a WHERE a.总分>g2.总分 AND a.bj=g2.bj)  && 班级名次



这样也能达到目的。

這種代碼用習慣了,最後的結果就是不會用VFP命令處理問題了。

坚守VFP最后的阵地
2017-11-06 11:41







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

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