| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1769 人关注过本帖
标题:请帮忙排序
只看楼主 加入收藏
schtg
Rank: 12Rank: 12Rank: 12
来 自:https://t.me/pump_upp
等 级:贵宾
威 望:67
帖 子:1546
专家分:3003
注 册: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
帖 子:640
专家分:2472
注 册:2018-3-13
收藏
得分:0 
sql-update 花的时间应该也差不多,至少一个数量级,只是你一楼的代码把一个O(1)复杂度的算法,活生生的写成了O(2)

这家伙很懒,啥也没留下
2023-03-21 07:42
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:火星
等 级:版主
威 望:37
帖 子:640
专家分:2472
注 册: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
来 自:https://t.me/pump_upp
等 级:贵宾
威 望:67
帖 子:1546
专家分:3003
注 册:2012-2-29
收藏
得分:0 
回复 34楼 csyx
试一试哈,谢谢!
2023-03-22 05:46
schtg
Rank: 12Rank: 12Rank: 12
来 自:https://t.me/pump_upp
等 级:贵宾
威 望:67
帖 子:1546
专家分:3003
注 册:2012-2-29
收藏
得分:0 
回复 34楼 csyx
我在电脑上测试了一下,比sdta的要稍慢一点哈。谢谢你的指点!
2023-03-22 05:50
wxzd123
Rank: 2
等 级:论坛游民
帖 子:328
专家分:58
注 册:2012-9-6
收藏
得分:0 
2023-03-23 07:25
快速回复:请帮忙排序
数据加载中...
 
   



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

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