标题:问个问题:怎么进行排序并标明顺序
只看楼主
baichuan
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:37
帖 子:953
专家分:589
注 册:2006-3-13
得分:0 
回复 15楼 whinda
谢谢,我感觉这样做仍然不能解决同分排名相同问题!

2016-02-21 16:08
baichuan
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:37
帖 子:953
专家分:589
注 册:2006-3-13
得分:0 
回复 14楼 taifu945
谢谢,您提交的结果已经满足我的要求了,只是我没看太明白怎么实现的!

2016-02-21 16:10
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
得分:0 
以下是引用baichuan在2016-2-21 16:10:36的发言:

谢谢,您提交的结果已经满足我的要求了,只是我没看太明白怎么实现的!

我就说核心思路吧:你一定看出来了,核心就在子查询上。这个子查询联合外层的update命令,利用内外层相互嵌套的工作原理找出比当前分数高的分数有几个(含重复的数量),在此统计基础上加1,就是当前分数的名次了。子查询中的WHERE字句是重点,它是找出比当前分数更高分的关键(注意看该字句中的表别名)。你还要弄懂子查询的工作原理:外层查询移动一条记录,子查询就要执行一次。而在带WHERE字句的情况下,UPDATE命令默认的处理范围是全部记录,所以,子查询在UPDATE每移动一次记录指针时,它都要执行一遍。这也是它为什么能针对每个分数都能判断准确的原因。
2016-02-21 21:07
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
回复 22楼 baichuan
SQL-SELECT对初学者不易读懂,下面代码易读些,可帮助理解。(结果不一定符合要求)

程序代码:
CREATE CURSOR tt (数学 I, 数学排名 I, 语文 I, 语文排名 I)
INSERT INTO tt VALUES (100, 0, 90, 0)
INSERT INTO tt VALUES (60, 0, 100, 0)
INSERT INTO tt VALUES (80, 0, 100, 0)
INSERT INTO tt VALUES (100, 0, 90, 0)
INSERT INTO tt VALUES (60, 0, 100, 0)
INSERT INTO tt VALUES (80, 0, 100, 0)
INDEX on 数学 TAG 数学 DESCENDING
INDEX on 语文 TAG 语文 DESCENDING
排名("数学", "数学排名")
排名("语文", "语文排名")
SET ORDER TO
BROWSE

FUNCTION 排名(科目, 排名)
    SET ORDER TO (科目)
    n学分 = 0
    n名次 = 1
    n序号 = 1
    SCAN
        IF EVALUATE(科目) != n学分
            n学分 = EVALUATE(科目)
            n名次 = n序号   
        ENDIF
        REPLACE (排名) WITH n名次
        n序号 = n序号 + 1
    ENDSCAN
ENDFUNC
2016-02-22 11:44
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
回复 22楼 baichuan
以下是引用taifu945在2016-2-20 16:41:25的发言:
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.语文)

以下是引用baichuan在2016-2-21 16:10:36的发言:
谢谢,您提交的结果已经满足我的要求了,只是我没看太明白怎么实现的!

或者可以这样理解:
程序代码:
SELECT Scoresort
SCAN 
    SELECT COUNT(T2.数学)+1 名次 FROM Scoresort T2 WHERE T2.数学>Scoresort.数学 INTO CURSOR tmp
    REPLACE 数学排名 WITH tmp.名次 IN "Scoresort"
    SELECT COUNT(T2.语文)+1 名次 FROM Scoresort T2 WHERE T2.语文>Scoresort.语文 INTO CURSOR tmp
    REPLACE 语文排名 WITH tmp.名次 IN "Scoresort"
ENDSCAN
BROWSE
2016-02-23 09:44
whinda
Rank: 6Rank: 6
等 级:贵宾
威 望:13
帖 子:253
专家分:418
注 册:2012-2-4
得分:0 
回复 21楼 baichuan
你要的不也就是同样分数同样排名么?!
2016-02-23 20:20
baichuan
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:37
帖 子:953
专家分:589
注 册:2006-3-13
得分:0 
回复 26楼 whinda
使用recno()出不来同样的顺序号吧?

2016-02-24 16:30
baichuan
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:37
帖 子:953
专家分:589
注 册:2006-3-13
得分:0 
回复 24楼 吹水佬
看明白了,你多了个判断是否同名次!呵呵!

2016-02-24 16:31
whinda
Rank: 6Rank: 6
等 级:贵宾
威 望:13
帖 子:253
专家分:418
注 册:2012-2-4
得分:0 
回复 27楼 baichuan

你没看懂我代码。你的问题既然解决了,替你高兴。
2016-02-24 17:07
aaaaaa
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:796
专家分:937
注 册:2012-9-4
得分:0 
一条语句(鱼版)

Create Cursor TT (数学 I, 语文 I)
Insert Into TT Values (100, 90)
Insert Into TT Values ( 60,100)
Insert Into TT Values ( 80,100)
Insert Into TT Values (100, 90)
Insert Into TT Values ( 60,100)
Insert Into TT Values ( 80,100)

Select *, ;
    (Select Count(数学) From TT Where 数学 > T1.数学) + 1 As 数学名次, ;
    (Select Count(语文) From TT Where 语文 > T1.语文) + 1 As 语文名次 ;
    From TT T1

民工子弟学校22班团小组长阳光模特队长冲锋篮球队前锋小苹果合唱队领唱蓝天舞蹈队编舞
2016-02-24 17:31



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




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

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