LAST_VALUE [analytic]
用于选择表或分区的最后一个值(由 window-order-clause 确定),无需使用自联接。 LAST_VALUE
在窗口顺序子句统计后,取分区的最后一个记录。然后此函数根据最后一个记录计算表达式,并返回结果。如果要使用最后值做为计算的基准,该函数非常有帮助。
将 LAST_VALUE()
与 window-order-clause 结合使用,以生成具有确定性的结果。如果没有为当前行指定
窗口,则默认窗口为 UNBOUNDED PRECEDING AND CURRENT ROW
。
提示
受默认窗口语义影响,LAST_VALUE
并非总是会返回分区的最后一个值。如果在分析子句中忽略 窗口框架子句,则 LAST_VALUE
会在此默认窗口中运行。虽然结果并不返回当前分区的最后一个值使其看起来并不直观,但是它返回了窗口的最后一个值,并且此值随当前正在处理的输入行而不断变化。如果您要返回分区的最后一个值,请使用 UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
。请看下方示例。
行为类型
不可变语法
LAST_VALUE ( expression [ IGNORE NULLS ] ) OVER (
[ window-partition-clause ]
[ window-order-clause ]
[ window-frame-clause ] )
参数
- 表达式
- 要求值的表达式,例如常数、列、非统计函数、函数表达式或任何涉及以上内容的表达式。
IGNORE NULLS
- 指定返回集中的最后一个非 NULL 值,或者如果所有值均为
NULL
,则返回NULL
。如果忽略此选项且集合中的最后一个值为 NULL,则函数将返回NULL
。 OVER()
- 请参阅分析函数。
示例
如果在分析数据时使用在 窗口框架 中定义的架构,以下查询并不会按照部门显示最高工资数;它会按照部门和工资显示最高工资数。
=> SELECT deptno, sal, empno, LAST_VALUE(sal)
OVER (PARTITION BY deptno ORDER BY sal) AS lv
FROM emp;
deptno | sal | empno | lv
--------+-----+-------+--------
10 | 101 | 1 | 101
10 | 104 | 4 | 104
20 | 100 | 11 | 100
20 | 109 | 7 | 109
20 | 109 | 6 | 109
20 | 109 | 8 | 109
20 | 110 | 10 | 110
20 | 110 | 9 | 110
30 | 102 | 2 | 102
30 | 103 | 3 | 103
30 | 105 | 5 | 105
如果包含了窗口框架子句 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
, LAST_VALUE()
按部门返回最高工资,是信息的准确表达。
=> SELECT deptno, sal, empno, LAST_VALUE(sal)
OVER (PARTITION BY deptno ORDER BY sal
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS lv
FROM emp;
deptno | sal | empno | lv
--------+-----+-------+--------
10 | 101 | 1 | 104
10 | 104 | 4 | 104
20 | 100 | 11 | 110
20 | 109 | 7 | 110
20 | 109 | 6 | 110
20 | 109 | 8 | 110
20 | 110 | 10 | 110
20 | 110 | 9 | 110
30 | 102 | 2 | 105
30 | 103 | 3 | 105
30 | 105 | 5 | 105
更多示例,请访问 FIRST_VALUE()。