[转自] http://blog.csdn.net/rfb0204421/article/details/7675911

注意:与max,min的区别,虽然也可以实现,但只是针对数字字段.

1、初始化原始数据:

create table test (id number(2), name varchar2(10), salary number(6,2));
insert into test values (1,'Tom',120);
insert into test values (2,'Ellen',240);
insert into test values (2,'Joe',80);
insert into test values (3,'Andy',300);
insert into test values (3,'Kary',500);
insert into test values (3,'Erick',1300);
insert into test values (3,'Hou',40);
insert into test values (3,'Mary',200);
insert into test values (3,'Secooler',800);
commit;
select * from test order by ID,name; ID NAME SALARY
--- ---------- --------
1 Tom 120.00
2 Ellen 240.00
2 Joe 80.00
3 Andy 300.00
3 Erick 1300.00
3 Hou 40.00
3 Kary 500.00
3 Mary 200.00
3 Secooler 800.00

2、LAST_VALUE分析函数的简单用法

(1)在TEST表中添加一列,标识每一个数据分区中薪水最高的人名。

select ID, name, salary, LAST_VALUE(name) OVER (partition by ID order by salary ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) as highest_sal_name from test order by ID, name;

 ID NAME         SALARY HIGHEST_SAL_NAME
--- ---------- -------- ----------------
1 Tom 120.00 Tom
2 Ellen 240.00 Ellen
2 Joe 80.00 Ellen
3 Andy 300.00 Erick
3 Erick 1300.00 Erick
3 Hou 40.00 Erick
3 Kary 500.00 Erick
3 Mary 200.00 Erick
3 Secooler 800.00 Erick

注意其中“ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING”的使用,若省略效果如下。

select ID, name, salary, LAST_VALUE(name) OVER (partition by ID order by salary) as highest_sal_name from test order by ID,name;

 ID NAME         SALARY HIGHEST_SAL_NAME
--- ---------- -------- ----------------
1 Tom 120.00 Tom
2 Ellen 240.00 Ellen
2 Joe 80.00 Joe
3 Andy 300.00 Andy
3 Erick 1300.00 Erick
3 Hou 40.00 Hou
3 Kary 500.00 Kary
3 Mary 200.00 Mary
3 Secooler 800.00 Secooler

显然这不是我们想要的效果:(,这是为什么呢~~~?给您一次思考和回答的机会。

如果对UNBOUNDED PRECEDING和UNBOUNDED FOLLOWING不熟悉,请参考Oracle官方文档“windowing_clause”http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/functions001.htm#i97640。

在TEST表中添加一列,标识每一个数据分区中薪水最高的薪水值。

col highest_sal_name for 9999
select ID, name, salary, LAST_VALUE(SALARY) OVER (partition by ID order by salary ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) as highest_sal_name from test order by ID, name; ID NAME SALARY HIGHEST_SAL_NAME
--- ---------- -------- ----------------
1 Tom 120.00 120
2 Ellen 240.00 240
2 Joe 80.00 240
3 Andy 300.00 1300
3 Erick 1300.00 1300
3 Hou 40.00 1300
3 Kary 500.00 1300
3 Mary 200.00 1300
3 Secooler 800.00 1300

3、与之相对应的是FIRST_VALUE函数

select ID, name, salary, FIRST_VALUE(name) OVER (partition by ID order by salary ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) as highest_sal_name from test order by ID, name;
ID NAME SALARY HIGHEST_SAL_NAME
--- ---------- -------- ----------------
1 Tom 120.00 Tom
2 Ellen 240.00 Joe
2 Joe 80.00 Joe
3 Andy 300.00 Hou
3 Erick 1300.00 Hou
3 Hou 40.00 Hou
3 Kary 500.00 Hou
3 Mary 200.00 Hou
3 Secooler 800.00 Hou
select ID, name, salary, FIRST_VALUE(SALARY) OVER (partition by ID order by salary ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) as highest_sal_name from test order by ID, name;
ID NAME SALARY HIGHEST_SAL_NAME
--- ---------- -------- ----------------
1 Tom 120.00 120
2 Ellen 240.00 80
2 Joe 80.00 80
3 Andy 300.00 40
3 Erick 1300.00 40
3 Hou 40.00 40
3 Kary 500.00 40
3 Mary 200.00 40
3 Secooler 800.00 40

Oracle分析函数系列之first_value/last_value:在记录集中查找第一条记录和最后一条记录的更多相关文章

  1. oracle分析函数系列之sum(col1) over(partition by col2 order by col3):实现分组汇总或递增汇总

    语法:sum(col1) over(partition by col2 order by col3 )  准备数据: DEPT_ID    ENAME          SAL1 1000       ...

  2. Oracle分析函数巧妙使用

    在 Oracle中使用Sql必须弄懂分析函数 Oracle开发专题之:分析函数(OVER) 1 Oracle开发专题之:分析函数2(Rank, Dense_rank, row_number) 6 Or ...

  3. Oracle分析函数-first_value()和last_value()

    first_value()和last_value()字面意思已经很直观了,取首尾记录值.例:查询部门最早发生销售记录日期和最近发生的销售记录日期 select dept_id ,sale_date , ...

  4. Oracle分析函数、窗口函数简单记录汇总

    一.分析函数.窗口函数一般形式 1.分析函数的形式分析函数带有一个开窗函数over(),包含三个分析子句:分组(partition by), 排序(order by), 窗口(rows) ,他们的使用 ...

  5. oracle分析函数与over()(转)

    文章参考:http://blog.csdn.net/haiross/article/details/15336313 -- Oracle分析函数入门-- 分析函数是什么? 分析函数是Oracle专门用 ...

  6. 小学生之Oracle分析函数

    分析函数是什么?分析函数是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计值. 分析函数和聚合函数的不同 ...

  7. oracle分析函数技术详解(配上开窗函数over())

    一.Oracle分析函数入门 分析函数是什么?分析函数是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计 ...

  8. Oracle分析函数——函数列表

    --------------聚合函数 SUM :该函数计算组中表达式的累积和 MIN :在一个组中的数据窗口中查找表达式的最小值 MAX :在一个组中的数据窗口中查找表达式的最大值 AVG :用于计算 ...

  9. Oracle分析函数及常用函数: over(),rank()over()作用及用法--分区(分组)求和& 不连续/连续排名

    (1)   函数:  over()的作用及用法:    -- 分区(分组)求和. sum() over( partition by column1 order by column2 )主要用来对某个字 ...

随机推荐

  1. Luogu 4069 [SDOI2016]游戏

    BZOJ 4515 树链剖分 + 李超线段树 要求支持区间插入一条线段,然后查询一个区间内的最小值.可以使用李超线段树解决,因为要维护一个区间内的最小值,所以每一个结点再维护一个$res$表示这个区间 ...

  2. You-need-to-know-css

    半透明边框 背景知识: background-clip <div class="main"> <input id="pb" type=&quo ...

  3. Appium移动端自动化测试之元素定位(三)

    1.name定位 driver.find_element_by_id(') driver.find_element_by_id(') driver.find_element_by_name('登录') ...

  4. 关于 Azure 安全性的 10 点提示

    讨论云服务时,安全性是一个关键领域.实际上,Windows Azure 基础结构实施大量的技术和流程来保护环境.此页介绍 Microsoft 的全球基础服务如何运行基础结构以及它们实施的安全措施. 从 ...

  5. 初学reactNative遇到的问题总结

    1.undefined is not an object (evaluating '_react3.default.PropTypes.shape') Navigator已经不再react nativ ...

  6. wp后台更新瓷片

    下载源码 还有一种方式,更新瓷片方式 1. /// <summary> /// 定时更新磁贴 /// </summary> public class ShellUpdate { ...

  7. Linux安装Oracle调整tmpfs以突破1.7G的限制

    调整/dev/shm的大小 ---------------------------------------------------------1.查看大小 df -h /dev/shm [@more@ ...

  8. C# 抽象(4)

    抽象类和普通类有区别嘛?在继承的时候,还是只能继承一次父类嘛? 答案: 抽象类除了在抽象方法和属性上面不能实现具体的代码之外和普通类没有区别.依旧符合类的基本特征.所以在继承的时候抽象类也是属于基类, ...

  9. [转]解读Unity中的CG编写Shader系列二

    上一篇文章的例子中我们可以看到顶点着色器的输出参数可以说是直接作为了片段着色器的形参传递过来,那么不由得一个问题浮现出来,顶点着色器的形参是从何处传递过来的? 顶点着色器的形参是gameObject ...

  10. linux联网配置(更新)

    重启网络配置:service network restart: 常见问题: linux 虚拟机ifconfig 显示eth1 文件ifcfg-eth0中device为eth0的问题   为什么eth0 ...