楼主: shift

[精华] 谁提供的排序算法最优?

[复制链接]
论坛徽章:
86
ITPUB元老
日期:2005-02-28 12:57:002012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20咸鸭蛋
日期:2012-05-08 10:27:19版主8段
日期:2012-05-15 15:24:112013年新春福章
日期:2013-02-25 14:51:24
11#
发表于 2003-3-12 18:25 | 只看该作者

这种做法是可行的

最初由 lodge 发布
[B]这样做不知道行不行
update test set o =
(select count(*) from test tmp
where tmp.v <= test.v); [/B]


但是问题的关键是,数据量大了得死的很难看

使用道具 举报

回复
论坛徽章:
59
马上加薪
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-01-04 11:49:54ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41灰彻蛋
日期:2011-10-28 14:15:35管理团队成员
日期:2011-05-07 01:45:082011新春纪念徽章
日期:2011-02-18 11:43:332011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:15
12#
发表于 2003-3-12 18:29 | 只看该作者
咳, 到那时候俺去买一台PVIII 试试 :P

使用道具 举报

回复
论坛徽章:
0
13#
 楼主| 发表于 2003-3-12 23:17 | 只看该作者
再再次感谢nyfor的回复。
你的如下方法在低版本oracle(8.06)中是可行的
------------------------------------------------------------------------------------
declare
i integer := 1;
begin
for c in (select rowid rid from test order by v desc) loop
update test set o = i where rowid = c.rid;
i := i + 1;
end loop;
end;
/
----------------------------------------------------------------------------------------
本人已测试通过,向你致敬,也向你的:“帮助别人,也在帮助自己!”致敬!
如果所有的高手都能向你这么想,我们的oracle应用也会前进得更快。

lodge 的如下代码也是可行的,也向你表示感谢!

update test set o =
(select count(*) from test tmp
where tmp.v <= test.v);

至于那种算法更优,我会在以后的实践中向大家报告。

这个命题是有典型意义的,希望各路高手跟贴,选出最优算法,可以做范例啊。

建议版主把该贴收入精华篇

使用道具 举报

回复
论坛徽章:
0
14#
 楼主| 发表于 2003-3-13 08:08 | 只看该作者
今天试了一种情况,出现了一点问题。请看:

SQL> select * from test;

        V ......O
--------- ---------
      2.8
     11.8
     11.8
     17.8
      8.8

如果出现两个数相同的情况,得到的结果就不如意了:(

-- nyfor的算法
declare
i integer := 1;
begin
for c in (select rowid rid from test order by v desc) loop
update test set o = i where rowid = c.rid;
i := i + 1;
end loop;
end;
/

select * from test;

   V.........O
---- ---------
2.8.........5
11.8.......2
11.8.......3
17.8.......1
8.8.........4
----------------------------------------------------------------------------------------------
理想的结果应该是二个2,不出现5

-- lodge的算法
update test set o =
(select count(*) from test tmp
where tmp.v >= test.v);

select * from test;

   V..........O
---- ---------
2.8.........5
11.8.......3
11.8.......3
17.8.......1
8.8.........4
-----------------------------------------------------------------------------------------------
也不理想啊。

有理想的方案吗?

使用道具 举报

回复
论坛徽章:
6
ITPUB元老
日期:2005-02-28 12:57:00授权会员
日期:2005-11-04 13:13:52会员2006贡献徽章
日期:2006-04-17 13:46:34在线时间
日期:2006-12-24 04:01:01会员2007贡献徽章
日期:2007-09-26 18:42:10ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41
15#
发表于 2003-3-13 08:39 | 只看该作者

奇怪了

我的在使用中出现了这个错误.
oracel8i personal version.
SQL> update test set o =
  2  (select tmp.rn from
  3  (select rowid rid,row_number() over (order by v desc) rn from test) tmp
  4  where test.rowid = tmp.rid);
update test set o =
*
ERROR at line 1:
ORA-00439: feature not enabled: OLAP Window Functions

使用道具 举报

回复
论坛徽章:
63
版主7段
日期:2012-05-15 15:24:11itpub13周年纪念徽章
日期:2014-10-08 15:16:50itpub13周年纪念徽章
日期:2014-10-08 15:16:50itpub13周年纪念徽章
日期:2014-10-08 15:16:50itpub13周年纪念徽章
日期:2014-10-10 14:34:59马上加薪
日期:2015-01-08 15:39:192015年新春福章
日期:2015-03-04 14:19:112015年新春福章
日期:2015-03-06 11:57:31
16#
发表于 2003-3-13 08:56 | 只看该作者
版本>=816

使用道具 举报

回复
论坛徽章:
24
会员2007贡献徽章
日期:2007-09-26 18:42:10马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-02-13 15:11:52
17#
发表于 2003-3-13 09:01 | 只看该作者
建个这样的游标吧,

SELECT *  FROM TEST ORDER BY V.

------


---------------

使用道具 举报

回复
论坛徽章:
6
ITPUB元老
日期:2005-02-28 12:57:00授权会员
日期:2005-11-04 13:13:52会员2006贡献徽章
日期:2006-04-17 13:46:34在线时间
日期:2006-12-24 04:01:01会员2007贡献徽章
日期:2007-09-26 18:42:10ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41
18#
发表于 2003-3-13 09:02 | 只看该作者
我的版本是oracle8i personal edition release 8.1.6.0.0.
难道不支持吗?

使用道具 举报

回复
论坛徽章:
86
ITPUB元老
日期:2005-02-28 12:57:002012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20咸鸭蛋
日期:2012-05-08 10:27:19版主8段
日期:2012-05-15 15:24:112013年新春福章
日期:2013-02-25 14:51:24
19#
发表于 2003-3-13 09:13 | 只看该作者

o,

declare
i integer := 1;
begin
for c in (select rowid rid from test order by v desc) loop
update test set o = i where rowid = c.rid;
i := i + 1;
end loop;
end;
/

用一个变量记录前一记录序号
一个变量循环自增

在循环体内,判定相临的  排序记录之间值是否相同
如果相同则 更新为跟前一个相同的序号,不同则更新为 自增序号

我想对于程序 处理这类问题,各位不应该太拘泥
pl/sql  之所以叫 pl/sql ,就是为了让大家施展  流程控制 结构 的长处的

btw: 关于 oracle8i personal edition release 8.1.6.0.0.
看你的 compatible 修改为 8.1.6 以上跟你的真实版本一致

使用道具 举报

回复
论坛徽章:
69
生肖徽章2007版:羊
日期:2008-11-14 14:42:19复活蛋
日期:2011-08-06 08:59:05ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20版主4段
日期:2012-05-15 15:24:11
20#
发表于 2003-3-13 09:21 | 只看该作者
最初由 shift 发布
[B]今天试了一种情况,出现了一点问题。请看:

SQL> select * from test;

        V ......O
--------- ---------
      2.8
     11.8
     11.8
     17.8
      8.8
[/B]

举例时把这种情况举出来我才知道呀,本想问你如果有相同的怎么处理的,但后来没问。

declare
i integer := 1;
begin
for c in (select v from test group by v order by v desc) loop
update test set o = i where v = c.v;
i := i + 1;
end loop;
end;
将得到如下结果:
V.........O
---- ---------
2.8.........4
11.8.......2
11.8.......2
17.8.......1
8.8.........3

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表