ITPUB??ì3
新一届的微软MVP评选已经开始,欢迎各位推荐!
ITPUB论坛 » Oracle数据库管理 » 取最新记录!

标题: 取最新记录!
在线/呼叫 zhouwf0726
版主


精华贴数 5
个人空间 927
技术积分 7433 (172)
社区积分 108 (3309)
注册日期 2006-2-22
论坛徽章:20
现任管理团队成员ITPUB北京九华山庄2008年会纪念徽章管理团队2007贡献徽章蓝锆石授权会员生肖徽章2007版:鸡
2008北京奥运纪念徽章:蹦床2008北京奥运纪念徽章:举重2008北京奥运纪念徽章:篮球BLOG每日发帖之星生肖徽章2007版:鸡生肖徽章2007版:鼠

发表于 2006-12-19 11:40 
取最新记录!

今天一个网友的问题:

create table T
(
  ID         NUMBER,
  NAME       VARCHAR2(20),
  ADDR       VARCHAR2(20),
  INSERTDATA DATE
);


insert into T (ID, NAME, ADDR, INSERTDATA)
values (1, '张', '北京', to_date('09-12-2006 10:07:45', 'dd-mm-yyyy hh24:mi:ss'));
insert into T (ID, NAME, ADDR, INSERTDATA)
values (3, '张', '北京', to_date('14-12-2006 10:08:05', 'dd-mm-yyyy hh24:mi:ss'));
insert into T (ID, NAME, ADDR, INSERTDATA)
values (2, '张', '北京', to_date('19-12-2006 10:08:42', 'dd-mm-yyyy hh24:mi:ss'));
insert into T (ID, NAME, ADDR, INSERTDATA)
values (4, '王', '上海', to_date('19-12-2006 10:09:33', 'dd-mm-yyyy hh24:mi:ss'));
insert into T (ID, NAME, ADDR, INSERTDATA)
values (5, '王', '上海', to_date('16-12-2006 10:10:15', 'dd-mm-yyyy hh24:mi:ss'));
commit;



我想取T这个表中姓名+地址相同,并且时间是最新的一条记录,有没有办法取出来?

答复:
SQL> select name,addr,rq from (select name,addr,to_char(insertdata,'yyyymmdd hh24:mi:ss') rq,rank() over(partition by name,addr order by insertdata desc) rn from t) where rn=1;


NAME                 ADDR                 RQ
-------------------- -------------------- -----------------
王                   上海                 20061219 10:09:33
张                   北京                 20061219 10:08:42


/*************************************************************************************/

近期问和重复行相关问题的还是很多,顺被把blog里的总结转一下:

http://zhouwf0726.itpub.net/post/9689/230599

create table students
(id number(15,0),
area varchar2(10),
stu_type varchar2(2),
score number(20,2));

create index idx_students on students(id);

insert into students values(1, '111', 'g', 80 );
insert into students values(1, '111', 'j', 80 );
insert into students values(1, '222', 'g', 89 );
insert into students values(1, '222', 'g', 68 );
insert into students values(2, '111', 'g', 80 );
insert into students values(2, '111', 'j', 70 );
insert into students values(2, '222', 'g', 60 );
insert into students values(2, '222', 'j', 65 );
insert into students values(3, '111', 'g', 75 );
insert into students values(3, '111', 'j', 58 );
insert into students values(3, '222', 'g', 58 );
insert into students values(3, '222', 'j', 90 );
insert into students values(4, '111', 'g', 89 );
insert into students values(4, '111', 'j', 90 );
insert into students values(4, '222', 'g', 90 );
insert into students values(4, '222', 'j', 89 );
commit;



SQL> delete from students a where rowid>(select min(rowid) from students b where a.id=b.id);

已删除12行。

已用时间: 00: 00: 00.03

执行计划
----------------------------------------------------------
Plan hash value: 3186961758

--------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------
| 0 | DELETE STATEMENT | | 1 | 50 | 4 (25)| 00:00:01 |
| 1 | DELETE | STUDENTS | | | | |
| 2 | NESTED LOOPS | | 1 | 50 | 4 (25)| 00:00:01 |
| 3 | VIEW | VW_SQ_1 | 4 | 100 | 4 (25)| 00:00:01 |
| 4 | SORT GROUP BY | | 4 | 100 | 4 (25)| 00:00:01 |
| 5 | TABLE ACCESS FULL| STUDENTS | 4 | 100 | 3 (0)| 00:00:01 |
|* 6 | INDEX RANGE SCAN | IDX_STUDENTS | 1 | 25 | 0 (0)| 00:00:01 |
--------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

6 - access("A"."ID"="ID"
filter(ROWID>"VW_COL_1"

Note
-----
- dynamic sampling used for this statement


统计信息
----------------------------------------------------------
787 recursive calls
16 db block gets
208 consistent gets
0 physical reads
0 redo size
673 bytes sent via SQL*Net to client
625 bytes received via SQL*Net from client
4 SQL*Net roundtrips to/from client
22 sorts (memory)
0 sorts (disk)
12 rows processed

SQL> rollback;

回退已完成。

已用时间: 00: 00: 00.01
SQL> alter system flush shared_pool;

系统已更改。

已用时间: 00: 00: 00.03
SQL> delete from students where rowid = (select rowid from (select rowid,row_number() over(partition by id order by id) rn from students) temp where students.rowid=temp.rowid and temp.rn>1);

已删除12行。

已用时间: 00: 00: 00.03

执行计划
----------------------------------------------------------
Plan hash value: 731036090

----------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------
| 0 | DELETE STATEMENT | | 1 | 25 | 11 (19)| 00:00:01 |
| 1 | DELETE | STUDENTS | | | | |
|* 2 | FILTER | | | | | |
| 3 | TABLE ACCESS FULL | STUDENTS | 4 | 100 | 3 (0)| 00:00:01 |
|* 4 | VIEW | | 4 | 100 | 4 (25)| 00:00:01 |
| 5 | WINDOW SORT | | 4 | 100 | 4 (25)| 00:00:01 |
| 6 | TABLE ACCESS FULL| STUDENTS | 4 | 100 | 3 (0)| 00:00:01 |
----------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

2 - filter(ROWID= (SELECT ROWID FROM (SELECT ROWID
"ROWID",ROW_NUMBER() OVER ( PARTITION BY "ID" ORDER BY "ID"
"RN",ROWID,ROWID FROM "STUDENTS" "STUDENTS" "TEMP" WHERE
"TEMP".ROWID=:B1 AND "TEMP"."RN">1))
4 - filter("TEMP".ROWID=:B1 AND "TEMP"."RN">1)

Note
-----
- dynamic sampling used for this statement


统计信息
----------------------------------------------------------
381 recursive calls
38 db block gets
188 consistent gets
0 physical reads
0 redo size
674 bytes sent via SQL*Net to client
724 bytes received via SQL*Net from client
4 SQL*Net roundtrips to/from client
23 sorts (memory)
0 sorts (disk)
12 rows processed

SQL> rollback;

回退已完成。

已用时间: 00: 00: 00.03
SQL> alter system flush shared_pool;

系统已更改。

已用时间: 00: 00: 00.03
SQL> delete from students a where rowid>any (select rowid from students b where a.id=b.id);

已删除12行。

已用时间: 00: 00: 00.03

执行计划
----------------------------------------------------------
Plan hash value: 1252538939

-----------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------
| 0 | DELETE STATEMENT | | 1 | 50 | 1 (0)| 00:00:01 |
| 1 | DELETE | STUDENTS | | | | |
| 2 | NESTED LOOPS SEMI| | 1 | 50 | 1 (0)| 00:00:01 |
| 3 | INDEX FULL SCAN | IDX_STUDENTS | 4 | 100 | 1 (0)| 00:00:01 |
|* 4 | INDEX RANGE SCAN| IDX_STUDENTS | 1 | 25 | 0 (0)| 00:00:01 |
-----------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

4 - access("A"."ID"="B"."ID"
filter(ROWID>ROWID AND ROWID
Note
-----
- dynamic sampling used for this statement


统计信息
----------------------------------------------------------
381 recursive calls
16 db block gets
72 consistent gets
0 physical reads
0 redo size
674 bytes sent via SQL*Net to client
624 bytes received via SQL*Net from client
4 SQL*Net roundtrips to/from client
10 sorts (memory)
0 sorts (disk)
12 rows processed

SQL> rollback;

回退已完成。

已用时间: 00: 00: 00.03
SQL> alter system flush shared_pool;

系统已更改。

已用时间: 00: 00: 00.03
SQL>



SQL> delete students where rowid in (
2 select rid from
3 (select rowid rid,row_number() over(partition by id order by id) rn from students)
4 where rn > 1) ;

已删除12行。

已用时间: 00: 00: 00.03

执行计划
----------------------------------------------------------
Plan hash value: 3190561995

-----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------------
| 0 | DELETE STATEMENT | | 1 | 37 | 6 (34)| 00:00:01 |
| 1 | DELETE | STUDENTS | | | | |
| 2 | NESTED LOOPS | | 1 | 37 | 6 (34)| 00:00:01 |
| 3 | VIEW | VW_NSO_1 | 4 | 48 | 4 (25)| 00:00:01 |
| 4 | SORT UNIQUE | | 1 | 100 | | |
|* 5 | VIEW | | 4 | 100 | 4 (25)| 00:00:01 |
| 6 | WINDOW SORT | | 4 | 100 | 4 (25)| 00:00:01 |
| 7 | TABLE ACCESS FULL | STUDENTS | 4 | 100 | 3 (0)| 00:00:01 |
| 8 | TABLE ACCESS BY USER ROWID| STUDENTS | 1 | 25 | 1 (0)| 00:00:01 |
-----------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

5 - filter("RN">1)

Note
-----
- dynamic sampling used for this statement


统计信息
----------------------------------------------------------
380 recursive calls
38 db block gets
89 consistent gets
0 physical reads
0 redo size
674 bytes sent via SQL*Net to client
686 bytes received via SQL*Net from client
4 SQL*Net roundtrips to/from client
9 sorts (memory)
0 sorts (disk)
12 rows processed



关于分析函数可以参考以下地址:
http://www.itpub.net/showthread.php?s=&threadid=608107


__________________
msn:zhouwf0726@hotmail.commail:zhouwf0726@163.com
只看该作者    顶部
离线 玉面飞龙
斧头帮帮主


精华贴数 1
个人空间 0
技术积分 10056 (118)
社区积分 3351 (407)
注册日期 2002-1-20
论坛徽章:23
现任管理团队成员ITPUB元老ITPUB北京九华山庄2008年会纪念徽章参与2007年甲骨文全球大会(中国上海)纪念管理团队2006纪念徽章蓝锆石
会员2007贡献徽章会员2006贡献徽章授权会员生肖徽章2007版:蛇生肖徽章2007版:龙2008北京奥运纪念徽章:排球

发表于 2006-12-19 12:36 
COOL~


__________________
只看该作者    顶部
离线 xuehongliang
还不算大拿儿


精华贴数 0
个人空间 0
技术积分 2505 (628)
社区积分 1511 (729)
注册日期 2006-3-24
论坛徽章:8
会员2007贡献徽章授权会员ITPUB新首页上线纪念徽章生肖徽章:龙生肖徽章:虎生肖徽章:马
生肖徽章:兔生肖徽章:猪    

发表于 2006-12-19 13:29 
不错的日志


__________________
http://E:load_pic65.gif要想改变生活,就要先改变自己.
只看该作者    顶部
离线 lfy_0128
一般会员



精华贴数 0
个人空间 0
技术积分 91 (17815)
社区积分 0 (1092823)
注册日期 2006-8-31
论坛徽章:1
生肖徽章2007版:鼠     
      

发表于 2006-12-26 12:24 
好帖子


只看该作者    顶部
离线 zhaomingfei
初级会员



精华贴数 0
个人空间 0
技术积分 2 (210877)
社区积分 0 (1265331)
注册日期 2007-1-31
论坛徽章:0
      
      

发表于 2007-1-31 15:46 
不错


只看该作者    顶部
离线 drew


精华贴数 0
个人空间 0
技术积分 3231 (460)
社区积分 335 (1767)
注册日期 2002-10-15
论坛徽章:10
ITPUB元老会员2007贡献徽章授权会员生肖徽章2007版:兔生肖徽章2007版:鼠生肖徽章2007版:猴
生肖徽章2007版:牛生肖徽章2007版:虎ITPUB新首页上线纪念徽章生肖徽章:猴  

发表于 2007-1-31 15:48 
楼主对分析函数相当熟悉,上次有问题,也是看的你的blog。


只看该作者    顶部
离线 tencher
初级会员



精华贴数 0
个人空间 0
技术积分 66 (22722)
社区积分 0 (966167)
注册日期 2006-5-30
论坛徽章:0
      
      

发表于 2007-2-1 13:40 
看完了:)


只看该作者    顶部
离线 hanjs
高级会员


精华贴数 1
个人空间 0
技术积分 9770 (122)
社区积分 51 (4856)
注册日期 2006-7-30
论坛徽章:16
会员2007贡献徽章蓝色妖姬嫦娥授权会员生肖徽章2007版:兔数据库板块每日发贴之星
数据库板块每日发贴之星2008年新春纪念徽章生肖徽章2007版:鸡生肖徽章2007版:鼠ITPUB新首页上线纪念徽章生肖徽章:蛇

发表于 2007-2-6 09:51 
越过不错,执行计划怎么看??问得比较低级了,我都是用pl/sql
的F5热键,可是看到的效果和上面的不一样啊,想学学优化方面的。请zhouwf0726兄帮忙了!


__________________
Database Concepts
Database Performance Tuning Guide and Reference
只看该作者    顶部
离线 yangtingkun
版主


精华贴数 12
个人空间 26927
技术积分 47563 (12)
社区积分 3163 (429)
注册日期 2001-12-29
论坛徽章:106
现任管理团队成员奥运纪念徽章NBA季后赛大富翁2008北京奥运纪念徽章:跳水2008北京奥运纪念徽章:拳击2008北京奥运纪念徽章:柔道
2008北京奥运纪念徽章:皮划艇静水2008北京奥运纪念徽章:体操2008北京奥运纪念徽章:曲棍球2008北京奥运纪念徽章:篮球2008北京奥运纪念徽章:举重2008北京奥运纪念徽章:自行车

发表于 2007-2-6 10:08 
Re: 取最新记录!



QUOTE:
最初由 zhouwf0726 发布
今天一个网友的问题:

create table T
(
  ID         NUMBER,
  NAME       VARCHAR2(20),
  ADDR       VARCHAR2(20),
  INSERTDATA DATE
);


insert into T (ID, NAME, ADDR, INSERTDATA)
values (1, '张', '北京', to_date('09-12-2006 10:07:45', 'dd-mm-yyyy hh24:mi:ss'));
insert into T (ID, NAME, ADDR, INSERTDATA)
values (3, '张', '北京', to_date('14-12-2006 10:08:05', 'dd-mm-yyyy hh24:mi:ss'));
insert into T (ID, NAME, ADDR, INSERTDATA)
values (2, '张', '北京', to_date('19-12-2006 10:08:42', 'dd-mm-yyyy hh24:mi:ss'));
insert into T (ID, NAME, ADDR, INSERTDATA)
values (4, '王', '上海', to_date('19-12-2006 10:09:33', 'dd-mm-yyyy hh24:mi:ss'));
insert into T (ID, NAME, ADDR, INSERTDATA)
values (5, '王', '上海', to_date('16-12-2006 10:10:15', 'dd-mm-yyyy hh24:mi:ss'));
commit;



我想取T这个表中姓名+地址相同,并且时间是最新的一条记录,有没有办法取出来?

答复:
SQL> select name,addr,rq from (select name,addr,to_char(insertdata,'yyyymmdd hh24:mi:ss') rq,rank() over(partition by name,addr order by insertdata desc) rn from t) where rn=1;


NAME                 ADDR                 RQ
-------------------- -------------------- -----------------
王                   上海                 20061219 10:09:33
张                   北京                 20061219 10:08:42


...

可以用一层SQL搞定
PHP code:


SQL
create table T

  2  
(

  
3  ID NUMBER,

  
4  NAME VARCHAR2(20),

  
5  ADDR VARCHAR2(20),

  
6  INSERTDATA DATE

  7  
);



表已创建。



SQL
insert into T (IDNAMEADDRINSERTDATA)

  
2  values (1'张''北京'to_date('09-12-2006 10:07:45''dd-mm-yyyy hh24:mi:ss'));



已创建 1 行。



SQL
insert into T (IDNAMEADDRINSERTDATA)

  
2  values (3'张''北京'to_date('14-12-2006 10:08:05''dd-mm-yyyy hh24:mi:ss'));



已创建 1 行。



SQL
insert into T (IDNAMEADDRINSERTDATA)

  
2  values (2'张''北京'to_date('19-12-2006 10:08:42''dd-mm-yyyy hh24:mi:ss'));



已创建 1 行。



SQL
insert into T (IDNAMEADDRINSERTDATA)

  
2  values (4'王''上海'to_date('19-12-2006 10:09:33''dd-mm-yyyy hh24:mi:ss'));



已创建 1 行。



SQL
insert into T (IDNAMEADDRINSERTDATA)

  
2  values (5'王''上海'to_date('16-12-2006 10:10:15''dd-mm-yyyy hh24:mi:ss'));



已创建 1 行。



SQL
commit;



提交完成。



SQL
ALTER SESSION SET NLS_DATE_FORMAT 'YYYY-MM-DD HH24:MI:SS';



会话已更改。



SQL
SELECT DISTINCT FIRST_VALUE(IDOVER(PARTITION BY NAMEADDR ORDER BY INSERTDATA DESCID

  
2   NAME

  
3   ADDR

  
4   FIRST_VALUE(INSERTDATAOVER(PARTITION BY NAMEADDR ORDER BY INSERTDATA DESCINSERTDATA

  5  FROM T
;



        
ID NAME                 ADDR                 INSERTDATA

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

         
4 王                   上海                 2006-12-19 10:09:33

         2 张                   北京                 2006
-12-19 10:08:42



.

不过用到了DISTINCT,效率可能反而会比两层嵌套还低。


__________________
学习ORACLE最大的障碍是什么——浮躁

http://yangtingkun.itpub.net

个人BLOG文章索引:http://www.itpub.net/showthread.php?s=&threadid=699527

11g的一点研究:http://www.itpub.net/852861.html
只看该作者    顶部
在线/呼叫 zhouwf0726
版主


精华贴数 5
个人空间 927
技术积分 7433 (172)
社区积分 108 (3309)
注册日期 2006-2-22
论坛徽章:20
现任管理团队成员ITPUB北京九华山庄2008年会纪念徽章管理团队2007贡献徽章蓝锆石授权会员生肖徽章2007版:鸡
2008北京奥运纪念徽章:蹦床2008北京奥运纪念徽章:举重2008北京奥运纪念徽章:篮球BLOG每日发帖之星生肖徽章2007版:鸡生肖徽章2007版:鼠

发表于 2007-2-6 10:12 


QUOTE:
最初由 hanjs 发布
越过不错,执行计划怎么看??问得比较低级了,我都是用pl/sql
的F5热键,可是看到的效果和上面的不一样啊,想学学优化方面的。请zhouwf0726兄帮忙了!


SQL> set linesize 200
SQL> set autotrace on
SQL> delete from students a where rowid>(select min(rowid) from students b where a.id=b.id);

已删除0行。


执行计划
----------------------------------------------------------
Plan hash value: 1993256812

------------------------------------------------------------------------------------
| Id  | Operation           | Name         | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------
|   0 | DELETE STATEMENT    |              |     1 |    25 |     4   (0)| 00:00:01 |
|   1 |  DELETE             | STUDENTS     |       |       |            |          |
|*  2 |   FILTER            |              |       |       |            |          |
|   3 |    TABLE ACCESS FULL| STUDENTS     |     4 |   100 |     3   (0)| 00:00:01 |
|   4 |    SORT AGGREGATE   |              |     1 |    25 |            |          |
|*  5 |     INDEX RANGE SCAN| IDX_STUDENTS |     1 |    25 |     1   (0)| 00:00:01 |
------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter(ROWID> (SELECT MIN(ROWID) FROM "STUDENTS" "B" WHERE
              "B"."ID"=:B1))
   5 - access("B"."ID"=:B1)

Note
-----
   - dynamic sampling used for this statement


统计信息
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          9  consistent gets
          0  physical reads
          0  redo size
        670  bytes sent via SQL*Net to client
        625  bytes received via SQL*Net from client
          4  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
          0  rows processed

SQL>


sql优化方面的资料可以到网上搜索 徐钰金 写的一篇文章
,或者看oracle联机文档。
我的blog有个转贴:
http://zhouwf0726.itpub.net/post/9689/164766
http://zhouwf0726.itpub.net/post/9689/164767
http://zhouwf0726.itpub.net/post/9689/164770
http://zhouwf0726.itpub.net/post/9689/164774

oracle性能优化知识点很多,建议有机会自己阅读:
Oracle® Database Performance Tuning Guide
10g Release 1 (10.1)
Part Number B10752-01




__________________
msn:zhouwf0726@hotmail.commail:zhouwf0726@163.com
只看该作者    顶部
相关内容


CopyRight 1999-2006 itpub.net All Right Reserved.
北京皓辰广域网络信息技术有限公司. 版权所有
E-mail:Webmaster@itpub.net
京ICP证:010037号 联系我们 法律顾问