标题:问个问题:怎么进行排序并标明顺序
只看楼主
不懂才问
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:大草原
等 级:贵宾
威 望:29
帖 子:1501
专家分:6573
注 册:2010-7-5
得分:0 
先按数学排,数学相同的按语文排,数学语文都相同的按姓名的拼音排,数学语文姓名都相同的按生日排

报告老师,我低头不是因为我在装低调,是你问的问题,我真的不会答,,,
2016-02-19 22:50
aaaaaa
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:796
专家分:937
注 册:2012-9-4
得分:0 
模拟 Oracle 的 Rank() Over、Dense_Rank、Row_Number() 和 Ntile() 四个排名函数,如果这个会做了,任何 VFP 的排名算法应该不在话下了。

S 版,你的进度怎样了?
这次我要赶在你的前头喽。

民工子弟学校22班团小组长阳光模特队长冲锋篮球队前锋小苹果合唱队领唱蓝天舞蹈队编舞
2016-02-20 09:24
liuxingang28
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山东济南
等 级:贵宾
威 望:47
帖 子:649
专家分:2156
注 册:2014-2-7
得分:1 
1. 分别对数学和语文建立索引
   index on 数学 tag 数学
   index on 语文 tag 语文
2. 建立一个排序子程序 MyOrder.prg
程序代码:
LPARAMETERS tcField_Score,tcField_No
LOCAL nScore,nNo,i
SET ORDER TO (tcField_Score) DESCENDING
nScore = EVALUATE(tcField_Score)
STORE 1 TO nNo,i
SCAN
    IF EVALUATE(tcField_Score) # nScore
        nSeqid = i
    ENDIF
    REPLACE (tcField_No) WITH nSeqid
    nScore = EVALUATE(tcField_Score)
    i = i +1
ENDSCAN
3. 调用子程序对成绩排序
   use 成绩表
   do MyOrder('数学','数学成绩')
   do MyOrder('语文','语文成绩')
   go top
   brow


泉城飞狐
2016-02-20 09:43
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
得分:15 
看楼主的要求,其实是同分占用名次的排序方式,也就是有两个同分的话,它们名次相同,但它们下一个分数就要跳开一个名次。
我利用命令窗口新建一个表文件,叫ScoreSort.DBF,表结构模仿了楼主的示例,分数随机生成。
命令:
CREATE TABLE ScoreSort FREE (数学 I, 数学排名 I,语文 I, 语文排名 I)
INSERT INTO ScoreSort (数学,语文) VALUES (INT(RAND()*11+90),INT(RAND()*11+90)) &&需要多次执行,以生成记录行

然后用以下命令可分别得到数学和语文的排名(不必事先索引,可乱序执行):
UPDATE Scoresort SET 数学排名=(SELECT COUNT(T2.数学)+1 名次 FROM ScoreSort T2 WHERE T2.数学>ScoreSort.数学)
UPDATE Scoresort SET 语文排名=(SELECT COUNT(T2.语文)+1 名次 FROM ScoreSort T2 WHERE T2.语文>ScoreSort.语文)

排序效果图:



如果是相同分数不占名次的排序方法,则只要在子查询的COUNT()函数中加入关键字DISTINCT即可。不知道你需不需要分班统计,如果有分班统计,代码就会更复杂。


[此贴子已经被作者于2016-2-20 16:49编辑过]

2016-02-20 16:41
whinda
Rank: 6Rank: 6
等 级:贵宾
威 望:13
帖 子:253
专家分:418
注 册:2012-2-4
得分:1 
源表S,字段:语文,数学

程序代码:
select distinct 语文,000 as wwmc from S into cursor csrA readwrite order by 语文 DESC
replace wwmc with recno() all
select distinct 数学,000 as sxmc from S into cursor csrB readwrite order by 数学 DESC
replace sxmc with recno() all

select S.语文,csrA.wwmc as 语文名次,S.数学,csrB.sxmc as 数学名次 from S,csrA,csrB where S.语文=csrA.语文 .and. S.数学=csrB.数学


临时表中新增的wwmc及sxmc字段的宽度根据实际的源表S中的记录数进行调整,示例中设为000表示为数值型3位,可以根据实际写为0000000000等。
2016-02-20 18:46
aaaaaa
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:796
专家分:937
注 册:2012-9-4
得分:1 
楼主,你提供全一些的样本数据,以及标准答案,我试试看。

作者:陆格艾 (aaaaaa)
模拟 Oracle 的 Rank() Over、Dense_Rank()、Row_Number() 和 Ntile() 四个排名函数

VFP_Rank_S()      && Rank 排名函数,返回一个唯一的值,如遇到相同数据时,取小号,排名值有间断。
VFP_Rank_B()      && Rank 排名函数,返回一个唯一的值,如遇到相同数据时,取大号,排名值有间断。
VFP_Dense_Rank()  && 密集排名函数,返回一个唯一的值,排名值连续。
VFP_Row_Number()  && 序数排名函数,返回一个唯一的值,当碰到相同数据时,排名按照记录集中记录的顺序依次递增,排名值连续。
VFP_Fractional()  && 分数排名函数,比如按成绩排列,前25%优秀,25%到50%良好,50%到75%差,75%到100%不及格。
VFP_Ntile()       && 分组排名函数,可以对序号进行分组处理名次 (比如三人一桶[组]为一档)。

民工子弟学校22班团小组长阳光模特队长冲锋篮球队前锋小苹果合唱队领唱蓝天舞蹈队编舞
2016-02-20 21:02
aaaaaa
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:796
专家分:937
注 册:2012-9-4
得分:0 
如果有详细的测试数据,我试试看提供鱼版和渔版两个版本的示例,自己找数据一下子找不到。

民工子弟学校22班团小组长阳光模特队长冲锋篮球队前锋小苹果合唱队领唱蓝天舞蹈队编舞
2016-02-20 21:10
baichuan
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:37
帖 子:953
专家分:589
注 册:2006-3-13
得分:0 
太感谢大家了,我需要的就是不同的成绩排名,相同排名占位!!!!


2016-02-21 16:03
baichuan
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:37
帖 子:953
专家分:589
注 册:2006-3-13
得分:0 
回复 10楼 aaaaaa
你在文中提到的函数是标准函数么?

2016-02-21 16:06
baichuan
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:37
帖 子:953
专家分:589
注 册:2006-3-13
得分:0 
回复 13楼 liuxingang28
我想过用索引的RECNO()值,可是不能解决同分排名相同问题!

2016-02-21 16:06



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-461803-1-1.html




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

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