标题:问个问题:怎么进行排序并标明顺序
只看楼主
aaaaaa
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:796
专家分:937
注 册:2012-9-4
得分:0 
模拟 Oracle 的 Rank() Over、Dense_Rank()、Row_Number() 和 Ntile() 四个排名函数(渔版)等 SDTA 老师来共同探讨
下面的是模拟 Rank() Over、Dense_Rank()、Row_Number() 排名函数(鱼版)

*!*    1. 构造样本表数据 : Total_Sales
Create Cursor Total_Sales (Id I Autoinc, Name V(8), Sales I)
Insert Into Total_Sales (Name, Sales) Values ("Solomon", 10)
Insert Into Total_Sales (Name, Sales) Values ("Jason"  , 15)
Insert Into Total_Sales (Name, Sales) Values ("Errol"  , 20)
Insert Into Total_Sales (Name, Sales) Values ("Garry"  , 40)
Insert Into Total_Sales (Name, Sales) Values ("Bernard", 50)
Insert Into Total_Sales (Name, Sales) Values ("Barry"  , 20)
Insert Into Total_Sales (Name, Sales) Values ("Stephen", 15)


*!*    方法 1:同号取大号 = Rank()
Select A1.Name, A1.Sales, Count(A2.Sales) As Sales_Rank ;
    From Total_Sales A1, Total_Sales A2 ;
    Where A1.Sales <= A2.Sales Or (A1.Sales = A2.Sales And A1.Name = A2.Name) ;
    Group By A1.Name, A1.Sales ;
    Order By A1.Sales Desc, A1.Name Desc


*!*    方法 2:同号取小号 = Rank()
Select A1.Name, A1.Sales, Count(A2.Sales) Sales_Rank ;
    From Total_Sales A1, Total_Sales A2 ;
    Where A1.Sales < A2.Sales Or (A1.Sales = A2.Sales And A1.Name = A2.Name) ;
    Group By A1.Name, A1.Sales ;
    Order By A1.Sales Desc, A1.Name Desc


*!*    方法 3:序数排名,排名值联号 = Row_Number()
Select Name, Sales, Recno() As Sales_Rank ;
    From (Select * ;
    From Total_Sales ;
    Order By Sales Desc) Total_Sales


*!*    方法 4:Dense_Rank()
Select A1.Name, A1.Sales, Count(DISTINCT A2.Sales) Sales_Rank ;
    From Total_Sales A1, Total_Sales A2 ;
    Where A1.Sales < A2.Sales Or (A1.Sales = A2.Sales And A1.Name = A2.Name) ;
    Group By A1.Name, A1.Sales ;
    Order By A1.Sales Desc, A1.Name Desc

Return

民工子弟学校22班团小组长阳光模特队长冲锋篮球队前锋小苹果合唱队领唱蓝天舞蹈队编舞
2016-02-24 17:40
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
得分:0 
以下是引用baichuan在2016-2-24 16:31:52的发言:

看明白了,你多了个判断是否同名次!呵呵!
嗯,吹版把我的意思逐步分解了,更易懂。然后,我觉得SELECT的临时表替换为数组(INTO ARRAY)可能更好,至少数组是内存里的东西,执行效率更高,后面的REPLACE也能更简洁一些。
2016-02-25 15:34
andy292
Rank: 2
等 级:论坛游民
威 望:1
帖 子:86
专家分:13
注 册:2005-2-26
得分:0 
学习一下成绩排序,好东西
2016-12-01 22:22
zhongguoxing
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2012-11-15
得分:0 
这个例子如果增加班级名称和班级中名次列,update在班级的名次可以加group by 班级吗?请问怎么加呢?
[quote]以下是引用taifu945在2016-2-20 16:41:25的发言:

看楼主的要求,其实是同分占用名次的排序方式,也就是有两个同分的话,它们名次相同,但它们下一个分数就要跳开一个名次。
我利用命令窗口新建一个表文件,叫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.语文)

排序效果图:



这个例子如果增加班级名称和班级中名次列,update在班级的名次可以加group by 班级吗?请问怎么加呢?
2017-12-08 10:05
zhongguoxing
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2012-11-15
得分:0 
这个例子如果增加班级名称和班级中名次列,update在班级的名次可以加group by 班级吗?请问怎么加呢?
[quote]以下是引用taifu945在2016-2-20 16:41:25的发言:

看楼主的要求,其实是同分占用名次的排序方式,也就是有两个同分的话,它们名次相同,但它们下一个分数就要跳开一个名次。
我利用命令窗口新建一个表文件,叫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.语文)

排序效果图:



这个例子如果增加班级名称和班级中名次列,update在班级的名次可以加group by 班级吗?请问怎么加呢?
2017-12-08 10:05
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:0 
陆格艾老师,我来了,你在那

坚守VFP最后的阵地
2021-03-29 17:00



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




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

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