| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2182 人关注过本帖
标题:请帮忙排序
只看楼主 加入收藏
schtg
Rank: 12Rank: 12Rank: 12
来 自:Usa
等 级:贵宾
威 望:67
帖 子:1790
专家分:3389
注 册:2012-2-29
收藏
得分:0 
回复 30楼 qqln
首行加上:set talk off  再试一下哈。
2023-03-21 07:17
qqln
Rank: 2
等 级:论坛游民
帖 子:9
专家分:16
注 册:2021-8-8
收藏
得分:0 
回复 31楼 schtg
这样速度差不多了
2023-03-21 07:19
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:火星
等 级:版主
威 望:37
帖 子:709
专家分:2848
注 册:2018-3-13
收藏
得分:0 
sql-update 花的时间应该也差不多,至少一个数量级,只是你一楼的代码把一个O(1)复杂度的算法,活生生的写成了O(2)

这家伙很懒,啥也没留下
2023-03-21 07:42
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:火星
等 级:版主
威 望:37
帖 子:709
专家分:2848
注 册:2018-3-13
收藏
得分:0 
试试这段sql在你的电脑上花多少时间,我这本本上大概也1.5秒,服务器上就秒出结果
三段排名算法一模一样,唯一不同的是 group by 多一个字段,更新回源表时 join on 连接条件也同样多一个字段
程序代码:
Close Databases
Clear
Use xqpx Exclusive

ss = Seconds()
*-- 联考排名
Select xk, jf, Cast(0 as I) rank ;
    from xqpx group by xk,jf order by xk,jf desc into cursor temp1 readwrite
Update temp1 set rank = Recno()
Select xk, Min(rank) as rank from temp1 group by xk into cursor temp2
Update t set t.rank = 1 + t.rank - s.rank from temp1 t inner join temp2 s on t.xk == s.xk
Update t set t.lkpx = s.rank from xqpx t inner join temp1 s on t.jf == s.jf

*-- 地市排名
Select dsmc, xk, jf, Cast(0 as I) rank ;
    from xqpx group by dsmc,xk,jf order by dsmc,xk,jf desc into cursor temp1 readwrite
Update temp1 set rank = Recno()
Select dsmc, xk, Min(rank) as rank from temp1 group by dsmc,xk into cursor temp2
Update t set t.rank = 1 + t.rank - s.rank ;
    from temp1 t inner join temp2 s on t.xk == s.xk and t.dsmc == s.dsmc
Update t set t.bspx = s.rank ;
    from xqpx t inner join temp1 s on t.jf == s.jf and t.xk == s.xk and t.dsmc == s.dsmc

*-- 县区排名
Select dsmc, xqmc, xk, jf, Cast(0 as I) rank ;
    from xqpx group by dsmc,xqmc,xk,jf order by dsmc,xqmc,xk,jf desc into cursor temp1 readwrite
Update temp1 set rank = Recno()
Select dsmc, xqmc, xk, Min(rank) as rank from temp1 group by dsmc,xqmc,xk into cursor temp2
Update t set t.rank = 1 + t.rank - s.rank from temp1 t ;
    inner join temp2 s on t.xk == s.xk and t.dsmc == s.dsmc and t.xqmc == s.xqmc
Update t set t.bxpx = s.rank ;
    from xqpx t inner join temp1 s ;
    on t.jf == s.jf and t.xk == s.xk and t.dsmc == s.dsmc and t.xqmc == s.xqmc

Use in temp2
Use in temp1
Wait window nowait noclear '耗时:' + Transform(Seconds()-ss)

Select xqpx
Locate
Browse


[此贴子已经被作者于2023-3-21 08:09编辑过]


这家伙很懒,啥也没留下
2023-03-21 08:05
schtg
Rank: 12Rank: 12Rank: 12
来 自:Usa
等 级:贵宾
威 望:67
帖 子:1790
专家分:3389
注 册:2012-2-29
收藏
得分:0 
回复 34楼 csyx
试一试哈,谢谢!
2023-03-22 05:46
schtg
Rank: 12Rank: 12Rank: 12
来 自:Usa
等 级:贵宾
威 望:67
帖 子:1790
专家分:3389
注 册:2012-2-29
收藏
得分:0 
回复 34楼 csyx
我在电脑上测试了一下,比sdta的要稍慢一点哈。谢谢你的指点!
2023-03-22 05:50
wxzd123
Rank: 2
等 级:论坛游民
帖 子:406
专家分:69
注 册:2012-9-6
收藏
得分:0 
2023-03-23 07:25
chychychy
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:325
专家分:105
注 册:2015-4-18
收藏
得分:0 
回复 31楼 schtg
(留个脚印学习了)加上这句快了相当多,0.493秒/47.21秒,可是中间也没弹出覆盖文件的提示呀?
2024-08-24 09:27
快速回复:请帮忙排序
数据加载中...
 
   



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

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