【问题标题】:how does first_value and last_value works with range unbounded preceding and current row?first_value 和 last_value 如何与范围无限的前行和当前行一起使用?
【发布时间】:2015-07-14 04:55:03
【问题描述】:
select 
    empno,deptno,sal,hiredate,extract(year from hiredate),
    last_value(sal) over(partition by deptno order by extract(year from hiredate) )
from emp;

7782    10  2450    09-JUN-81   1981    5000
7839    10  5000    17-NOV-81   1981    5000
7934    10  1300    23-JAN-82   1982    1300
7369    20  800     17-DEC-80   1980    800
7566    20  2975    02-APR-81   1981    3000
7902    20  3000    03-DEC-81   1981    3000
7876    20  1100    23-MAY-87   1987    3000
7788    20  3000    19-APR-87   1987    3000
7900    30  950     03-DEC-81   1981    2850
7654    30  1250    28-SEP-81   1981    2850
7521    30  1250    22-FEB-81   1981    2850
7844    30  1500    08-SEP-81   1981    2850
7499    30  1600    20-FEB-81   1981    2850
7698    30  2850    01-MAY-81   1981    2850

select 
    empno,deptno,sal,hiredate,extract(year from hiredate),
    first_value(sal) over(partition by deptno order by extract(year from hiredate))
from emp;

7782    10  2450    09-JUN-81   1981    2450
7839    10  5000    17-NOV-81   1981    2450
7934    10  1300    23-JAN-82   1982    2450
7369    20  800     17-DEC-80   1980    800
7566    20  2975    02-APR-81   1981    800
7902    20  3000    03-DEC-81   1981    800
7876    20  1100    23-MAY-87   1987    800
7788    20  3000    19-APR-87   1987    800
7900    30  950     03-DEC-81   1981    950
7654    30  1250    28-SEP-81   1981    950
7521    30  1250    22-FEB-81   1981    950
7844    30  1500    08-SEP-81   1981    950
7499    30  1600    20-FEB-81   1981    950
7698    30  2850    01-MAY-81   1981    950

first_Value 函数返回有序集中的第一个值。在上面的例子中,它返回每个部门的第一个工资值。

但是last_value 没有返回预期的输出,它应该返回有序集中的last_value。这里last_value() 的工作方式不同,它考虑了与年份相关的最后一个值(在 order by 子句中提到)

为什么它的工作方式不同?

【问题讨论】:

    标签: sql oracle oracle11g window-functions


    【解决方案1】:

    如果省略窗口子句,则在 FIRST_VALUE 和 LAST_VALUE 函数的情况下默认为 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW

    这意味着,对于分区中的每条记录,窗口的起点是第一条记录。所以,你得到所有行的相同值 FIRST_VALUE 函数。

    但是,终点是当前行本身,每行都会不断变化。因此,您将当前行的值作为 LAST_VALUE 函数。但是,如果您的 ORDER BY 子句不足以可靠地识别订单,则会出现平局,并且行将被任意排序,如您的示例所示,尤其是对于部门 30。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-08
      • 1970-01-01
      • 2015-04-30
      • 2012-05-06
      相关资源
      最近更新 更多