Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1182571
  • 博文数量: 398
  • 博客积分: 10110
  • 博客等级: 上将
  • 技术积分: 4055
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-23 20:01
个人简介

新博客http://www.cnblogs.com/zhjh256 欢迎访问

文章分类

全部博文(398)

文章存档

2012年(1)

2011年(41)

2010年(16)

2009年(98)

2008年(142)

2007年(100)

我的朋友

分类: Oracle

2008-01-06 21:44:21

示例表:

CREATE TABLE TMP_NOTES( 
NOTE_ID NUMBER PRIMARY KEY, 
GROUP_ID NUMBER, 
NOTE VARCHAR2(4000) NOT NULL, 
CREATE_DATE DATE NOT NULL, 
CREATED_BY VARCHAR2(30) NOT NULL);

 

INSERT INTO TMP_NOTES
VALUES
  (1,
   1,
   'Customer refunded for missing item',
   TO_DATE('11/23/2004', 'MM/DD/YYYY'),
   'CUSTOMER_SERVICE');
INSERT INTO TMP_NOTES
VALUES
  (2,
   2,
   'Customer returning entire shipment',
   TO_DATE('1/5/2005', 'MM/DD/YYYY'),
   'CUSTOMER_SERVICE');
INSERT INTO TMP_NOTES
VALUES
  (3,
   2,
   'Shipment has not arrived',
   TO_DATE('2/5/2005', 'MM/DD/YYYY'),
   'WAREHOUSE');

如要查询某个组中最后输入的一个note,如果不使用分析函数,可以使用以下语句:

SELECT *
  FROM TMP_NOTES tn
 WHERE (tn.GROUP_ID, tn.CREATE_DATE) IN
       (SELECT tn2.GROUP_ID, MAX(tn2.CREATE_DATE)
          FROM TMP_NOTES tn2
         GROUP BY tn2.GROUP_ID)

但是如果一天输入了两条note,那么该问题将无法解决(因为两条数据都会返回)。二、必须扫描TMP_NOTES表两次。而使用分析函数可以完全消除问题1并提高问题而的性能。

SELECT L1.*
  FROM (SELECT tn.*,
               ROW_NUMBER() OVER(PARTITION BY tn.GROUP_ID ORDER BY tn.CREATE_DATE DESC) RN
          FROM TMP_NOTES tn) L1
 WHERE RN = 1

       ROW_NUMBER() OVER(PARTITION BY tn.GROUP_ID ORDER BY tn.CRE ATE_DATE DESC”告诉OracleTMP_NOTES以组分成GROUP_ID并且对于每个组,以CREATE_DATE降序显示。

 

使用分析函数需要理解的问题

       首先分析函数在结果集上工作,而不是全部数据。

       第二个关键的问题是partition bygroup by非常像,但是全部行都将保留在结果集中。

       第三,分析函数在各个分区上独立的工作。

阅读(840) | 评论(0) | 转发(0) |
0

上一篇:分析函数的本质

下一篇:动态sql vs dbms_sql

给主人留下些什么吧!~~