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()
的工作方式不同,考虑了年份的最后一个值(按顺序中的顺序提到)
为什么它的工作方式不同?
答案 0 :(得分:0)
如果省略windowing子句,则在FIRST_VALUE和LAST_VALUE函数的情况下默认为RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
。
这意味着,对于分区中的每个记录,窗口的起始点是第一个记录。因此,您获得的所有行的值都相同 FIRST_VALUE函数。
但是,终点是当前行本身,它会不断更改每一行。因此,您将当前行的值作为值 LAST_VALUE函数。但是,如果您的ORDER BY子句不足以可靠地识别订单,则会有一个平局,行将被任意排序,如您的示例所示,尤其是对于部门30。