| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2826 人关注过本帖, 1 人收藏
标题:新人求助:如何实现按某一字段的值排名,且相同的值排名相同?
只看楼主 加入收藏
mxbing1984
Rank: 7Rank: 7Rank: 7
来 自:贵州道真
等 级:贵宾
威 望:37
帖 子:73
专家分:342
注 册:2014-8-8
收藏
得分:0 
回复 22楼 sdta
--SQL的排名次(中式和美式)
Select *,RANK() Over(Order By V) From T
Select *,DENSE_RANK() Over(Order By V) From T
--带分组的排名次
Select *,RANK() Over(partition by 分组 Order By V) From T
Select *,DENSE_RANK() Over(partition by 分组 Order By V) From T



Create Table T
(
V int
)

insert into T values(1)
 
--产生100W+的测试数据
declare @I int =0
while @I<=19
begin
insert into T
    select convert(int,convert(varbinary,newid())) from T
Set @I=@I+1
End

--以上排名次执行时间是8S,I3处理器,不知道VFP要几秒?VFP命令比SQL强100倍,那是应该毫秒级别的咯

[ 本帖最后由 mxbing1984 于 2015-1-23 15:19 编辑 ]

天再高,踮起脚尖就能更接近阳光
2015-01-23 15:18
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10559
专家分:42996
注 册:2014-5-20
收藏
得分:0 
以下是引用mxbing1984在2015-1-23 15:18:30的发言:

--SQL的排名次(中式和美式)
Select *,RANK() Over(Order By V) From T
Select *,DENSE_RANK() Over(Order By V) From T
--带分组的排名次
Select *,RANK() Over(partition by 分组 Order By V) From T
Select *,DENSE_RANK() Over(partition by 分组 Order By V) From T



Create Table T
(
V int
)

insert into T values(1)
 
--产生100W+的测试数据
declare @I int =0
while @I<=19
begin
insert into T
    select convert(int,convert(varbinary,newid())) from T
Set @I=@I+1
End

--以上排名次执行时间是8S,I3处理器,不知道VFP要几秒?VFP命令比SQL强100倍,那是应该毫秒级别的咯

“比SQL强100倍”可能是指在VFP环境下用SQL命令与非SQL命令的对比。
如果VFP环境与非VFP环境不好比。
再试试生成如下百W编码所需时间:
000000
000001
000002
......
999997
999998
999999
2015-01-23 16:17
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9809
专家分:26997
注 册:2012-2-5
收藏
得分:0 
我上面说的是在VFP中SQL命令的应用

坚守VFP最后的阵地
2015-01-23 16:25
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
那么简单的统计,用vfp自身指令用不着8s,扫描一趟不需那么长时间。

授人以渔,不授人以鱼。
2015-01-23 16:34
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9809
专家分:26997
注 册:2012-2-5
收藏
得分:0 
程序代码:
t1=Seconds()
Create Cursor tt (xx c(6))
For lnI=0 To 999999
    Insert into tt values (Padl(lnI,6,"0"))
EndFor
MessageBox("运行时间:"+Transform(Seconds()-t1)+" 秒")
Browse


按我前面贴图的配置,将近一秒。

坚守VFP最后的阵地
2015-01-23 18:57
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
SQL Server发布时测试的基础配置是16G内存,他们是在这个配置上说SQL查询速度快的。另一个速度的主要影响因素是硬盘的速度,采用阵列硬盘等于并行,速度也快,故数据库服务器都采用那种硬盘配置。没有这种配置的,谈不上SQL查询的优势——事实上,在多并发查询以及出现“不良查询”请求时,SQL Server甚至会崩溃。基本上,SQL是靠硬件资源来支撑的。

参考下面的资料:http://


授人以渔,不授人以鱼。
2015-01-23 19:15
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9809
专家分:26997
注 册:2012-2-5
收藏
得分:0 
回复 36楼 TonyDeng
你不去做老师,有点倔才了

坚守VFP最后的阵地
2015-01-23 19:38
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
其实1楼的要求,用基本指令写,逻辑很简单,因为只要在索引的基础上遍历一次数据表即可,那是最低的消耗了,不可能有什么更高级的指令比这个消耗更低,你总不能跳过若干记录不处理。

程序处理的逻辑:建立索引后,遍历数据表,在遍历时,用一个变量记录名次,如果下一条记录的分数与上一条相同,则名次不变(按排名规则决定变或不变),若不同,则名次加一,这样扫描一趟,就排好了。哪用得着写记录集包含记录集还加分组的,看都看不明白那是什么逻辑。

授人以渔,不授人以鱼。
2015-01-23 19:49
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 37楼 sdta
我上次给你做的那个,实际上相当于两趟扫描,因为要求把结果写在靠后的日期上,而索引是升序的,故需要回溯,如果写在前面,则只要扫描一趟,速度可以翻倍。其实,回想起来,那个问题用降序索引也可以,你试试。

授人以渔,不授人以鱼。
2015-01-23 19:57
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
建立索引的操作,基本上是把表遍历一趟,同时生成磁盘文件,那个时间可作为衡量最高处理速度的指标,只要是对全表操作,一定不会比这个时间短(免写盘的例外会快一点)。在那个110万记录的表中(实际上对两个表建索引,另一个是1.8万条记录),创建索引用时7s左右,还顺带把每条记录的一个字段刷写了一遍。而在后期的数据统计中,两趟扫描是17s多,正是一趟的大约2倍。

[ 本帖最后由 TonyDeng 于 2015-1-23 20:34 编辑 ]

授人以渔,不授人以鱼。
2015-01-23 20:07
快速回复:新人求助:如何实现按某一字段的值排名,且相同的值排名相同?
数据加载中...
 
   



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

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