`
jayghost
  • 浏览: 440151 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Oracle keep()使用

 
阅读更多

转:http://blog.csdn.net/wanghai__/article/details/5011051

ORACLE中的KEEP()使用方法

2种取值:
DENSE_RANK FIRST 
DENSE_RANK LAST

SQL> select * from test;

ID MC SL
-------------------- -------------------- -------------------
1 111 1
1 222 1
1 333 2
1 555 3
1 666 3
2 111 1
2 222 1
2 333 2
2 555 2

9 rows selected

SQL> 
SQL> select id,mc,sl,
2 min(mc) keep (DENSE_RANK first ORDER BY sl) over(partition by id),
3 max(mc) keep (DENSE_RANK last ORDER BY sl) over(partition by id)
4 from test
5 ;

ID MC SL MIN(MC)KEEP(DENSE_RANKFIRSTORD MAX(MC)KEEP(DENSE_RANKLASTORDE
-------------------- -------------------- ------------------- ------------------------------ ------------------------------
1 111 1 111 666
1 222 1 111 666
1 333 2 111 666
1 555 3 111 666
1 666 3 111 666
2 111 1 111 555
2 222 1 111 555
2 333 2 111 555
2 555 2 111 555

9 rows selected

SQL>

不要混淆keep内(first、last)外(min、max或者其他):
min是可以对应last的
max是可以对应first的
SQL> select id,mc,sl,
2 min(mc) keep (DENSE_RANK first ORDER BY sl) over(partition by id),
3 max(mc) keep (DENSE_RANK first ORDER BY sl) over(partition by id),
4 min(mc) keep (DENSE_RANK last ORDER BY sl) over(partition by id),
5 max(mc) keep (DENSE_RANK last ORDER BY sl) over(partition by id)
6 from test
7 ;

ID MC SL MIN(MC)KEEP(DENSE_RANKFIRSTORD MAX(MC)KEEP(DENSE_RANKFIRSTORD MIN(MC)KEEP(DENSE_RANKLASTORDEMAX(MC)KEEP(DENSE_RANKLASTORDE
-------------------- -------------------- ------------------- ------------------------------ ------------------------------ ------------------------------ ------------------------------
1 111 1 111 222 555 666
1 222 1 111 222 555 666
1 333 2 111 222 555 666
1 555 3 111 222 555 666
1 666 3 111 222 555 666

2 111 1 111 222 333 555
2 222 1 111 222 333 555
2 333 2 111 222 333 555
2 555 2 111 222 333 555

 

 

对于id=1的结果集进行一下解释
min(mc) keep (DENSE_RANK first ORDER BY sl) over(partition by id):id等于1的数量最小的(DENSE_RANK first )为
1 111 1 
1 222 1 
在这个结果中取min(mc) 就是111
max(mc) keep (DENSE_RANK first ORDER BY sl) over(partition by id)
取max(mc) 就是222;
min(mc) keep (DENSE_RANK last ORDER BY sl) over(partition by id):id等于1的数量最大的(DENSE_RANK first )为
1 555 3 
1 666 3

在这个结果中取min(mc) 就是555,取max(mc)就是666

id=2的结果集同理

 

 

 

***********************************************

转:http://blog.csdn.net/java3344520/article/details/5603309

oracle keep(first/last)

 先看一段ORACLE官方文档

http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96520/analysis.htm#25806:

FIRST/LAST Functions

The FIRST/LAST aggregate functions allow you to return the result of an aggregate applied over a set of rows that rank as the first or last with respect to a given order specification. FIRST/LAST lets you order on column A but return an result of an aggregate applied on column B. This is valuable because it avoids the need for a self-join or subquery, thus improving performance. These functions begin with a tiebreaker function, which is a regular aggregate function (MINMAXSUMAVGCOUNTVARIANCESTDDEV) that produces the return value. The tiebreaker function is performed on the set rows (1 or more rows) that rank as first or last respect to the order specification to return a single value.

To specify the ordering used within each group, the FIRST/LAST functions add a new clause starting with the word KEEP.

 

大意是说FIRST/LAST函数按照某个字段排序后取得第一行或者最后一行,FIRST/LAST聚集函数可以按A列排序,B列聚集,避免了自连接和子查询.分组聚合函数(min,max....)位于FIRST/LAST函数之前产生多行结果集,并且按照排序返回FIRST/LAST单个值.

要指定在每个组的顺序,FIRST/LAST函数之前加上以关键字KEEP开始即可

FIRST/LAST Syntax

These functions have the following syntax:

aggregate_function KEEP

( DENSE_RANK LAST ORDER BY

expr [ DESC | ASC ] [NULLS { FIRST | LAST }]

 [, expr [ DESC | ASC ] [NULLS { FIRST | LAST }]]...)

[OVER query_partitioning_clause]

 

Note that the ORDER BY clause can take multiple expressions.请注意在ORDER BY子句可以采取多种表现形式


Returns the row ranked first using DENSE_RANK   

 

 

2种取值:
DENSE_RANK FIRST 
DENSE_RANK LAST 
在keep (DENSE_RANK first ORDER BY sl) 结果集中再取max、min的例子。

 

例子如下:oracle分析函数中,keep and over的区别
公司部门中入厂时间最早的员工的薪水最小的是多少
SQL>SELECT deptno,ename,empno,sal,

MIN(sal) KEEP (dense_rank FIRST ORDER BY hiredate) over (PARTITION BY deptno) "min_sal"
FROM emp;

 

 

DEPTNO ENAME EMPNO HIREDATE SAL min_sal
10 CLARK 7782 1981-06-09 2450.00 2450
10 KING 7839 1981-11-17 5000.00 2450
10 MILLER 7934 1982-01-23 1300.00 2450
20 yang_ping 7389 1980-12-17 2700.00 800
20 SMITH 7369 1980-12-17 800.00 800
20 ADAMS 7876 1987-05-23 1100.00 800
20 FORD  7902 1981-12-03 3000.00 800
20 SCOTT 7788 1987-04-19 4000.00 800
20 JONES 7566 1981-02-22 2975.00 800
30 ALLEN 7499 1981-02-20 1600.00 1600
30 BLAKE 7698 1981-05-01 2850.00 1600
30 MARTIN 7654 1981-09-28 1250.00 1600
30 JAMES 7900 1981-12-03 950.00 1600
30 TURNER 7844 1981-12-03 1500.00 1600
30 WARD 7521 1981-02-22 1250.00 1600

查看结果分析:红色部分,2个入厂日期一样,同时取工资最低得到800

 

 

再看一个:计算部门平均工资,并且入工厂最早的最低的工资

SQL>select deptno,avg(sal) as sal,

min(sal)KEEP (dense_rank FIRST ORDER BY hiredate)  AS min_sal
from emp group by deptno;

 

DEPTNO SAL MIN_SAL
10 3437.5 2450
20 2645.833 800
30 1566.667 1600
分享到:
评论

相关推荐

    转oracle keep池.docx

    Oracle数据库的KEEP池是Oracle 8.0及更高版本中引入的一个高级特性,它允许数据库管理员(DBA)对数据缓存进行更精细化的管理。KEEP池的主要目的是为那些经常被访问但又容易因缓存竞争而被挤出缓存的段提供一个专门的...

    Oracle数据库管理员技术指南

    8.2.4 使用 DBMS_SHARED_POOL.KEEP 的技巧 8.2.5 怎样生成进行固定操作的脚本 8.2.6 使用 DBMS_SHARED_POOL .UNKEEP 的技巧 8.3 优化数据排序的技术 8.3.1 在内存中进行全部或大部分排序 8.3.2 最小化排序时...

    Oracle 12c备份恢复-RMAN工具技术手册

    本文档旨在提供 Oracle 12c 备份恢复的技术手册,主要介绍 RMAN 工具的概念、架构、备份类型和使用方法。 一、RMAN 概念 RMAN(Recovery Manager)是 Oracle 推荐的备份和恢复工具。使用 RMAN 可以进行数据库备份...

    直接拷贝数据文件实现Oracle数据迁移

    在确认数据完整无误后,你可以在新环境中开始正常使用Oracle数据库。 总的来说,直接拷贝数据文件的迁移方式适用于特定条件下的Oracle数据迁移,它简化了传统备份恢复过程,但仍然需要谨慎操作,以避免数据丢失或不...

    服务器资源占用脚本甲骨文服务器保活脚本Oracle Server Keep Alive Script项目资源.zip

    服务器资源占用脚本甲骨文服务器保活脚本Oracle Server Keep Alive Script项目资源

    Oracle内存分配与调整--大牛冯春培的一篇文章

    - Database Buffers:数据缓冲区,根据不同的Oracle版本,该部分可能包含db_block_buffer、db_block_size、buffer_pool_keep、buffer_pool_recycle、db_cache_size等。 - Redo Buffers:重做日志缓冲区(log_buffer...

    oracle数据库的内存调整

    PGA 则主要包含用户全局区(User Global Area, UGA),在Oracle使用共享服务器模式(Multithreaded Server, MTS)时,部分UGA会放入large_pool_size中。UGA存储了用户的会话信息,如游标、变量和PL/SQL工作区等。 ...

    Oracle内存管理(深入解析)

    Buffer Cache用于存储最近使用的数据块,Oracle使用LRU算法管理这些缓存,确保高效的缓存命中率。Buffer Cache被划分为Default、Keep和Recycle三个池,以满足不同类型的存储需求。Shared Pool用于存储解析的SQL语句...

    Oracle数据库参数设置技术手册

    CPU_COUNT 是 Oracle数据库参数设置技术手册中另一个重要的参数,它控制着数据库的 CPU 使用率,对数据库的性能和稳定性有着重要的影响。数据库管理员可以根据实际情况调整 CPU_COUNT 的值,以提高数据库的性能和...

    ORACLE RMAN 简明使用手册

    ### ORACLE RMAN 简明使用手册 #### 背景信息 本文档基于 Oracle 10gR2 版本,旨在为用户提供一份简洁明了的 Oracle RMAN(Recovery Manager)备份与恢复命令的手册。RMAN 是 Oracle 数据库的一个重要组成部分,...

    Oracle数据库sqlplus常用命令

    14. 使用archive log list命令知道ORACLE数据库的备份和恢复策略和归档文件的具体位置。 该命令用于获取备份和恢复策略和归档文件的位置信息。 通过这些命令,我们可以获取Oracle数据库的详细信息,包括数据库信息...

    oracle数据库调优配置

    7. **Db_keep_cache_size**: 配置为224MB,用于保持经常使用的数据块不被替换,提高热数据的访问速度。 8. **Workarea_size_policy**: 设置为AUTO,使Oracle能够根据工作区的实际需求动态调整其大小,避免了固定...

    Oracle 2 Day DBA

    how to perform all common administrative tasks needed to keep the database operational. These tasks include configuring the database, managing memory and storage, managing users, managing database ...

    oracle初始化参数详解

    11. **control_files**:指定控制文件的路径,Oracle建议使用多个文件进行镜像以增加可靠性。 12. **core_dump_dest**:在Unix环境下,设定核心转储文件的存储位置。 13. **cpu_count**:Oracle用于计算其他参数的...

    ORACLE quota 表空间限制

    在 Oracle 数据库中,为了更好地管理和控制用户对不同表空间的使用情况,引入了 Quota 的概念。Quota 主要用于限制用户在一个或多个表空间内所能使用的最大空间量。通过设置合适的 Quota,不仅可以有效地防止用户...

    任务计划+批处理实现Oracle数据库的定时备份

    Oracle数据库作为全球广泛使用的数据库管理系统之一,其稳定性和安全性备受赞誉。为了确保数据的安全,定期备份是必要的操作。本文将详细介绍如何利用任务计划和批处理脚本来实现Oracle数据库的定时备份。 一、任务...

    Oracle Lob Performance Guidelines

    7. **避免不必要的数据复制**:当需要对 LOB 数据进行操作时,尽量避免不必要的数据复制过程,例如通过使用 `KEEP` 或 `BASICFILE` 子类型来减少数据移动。 8. **使用 Direct Path 插入**:在插入大量 LOB 数据时,...

Global site tag (gtag.js) - Google Analytics