Oracle数据库提供了一系列强大的分析函数,其中包括FIRST_VALUE
和LAST_VALUE
。这两个函数在处理分组数据时尤其有用,能够提取出每组数据中的首个值和末位值。本文将进行详细介绍。
FIRST_VALUE 函数
FIRST_VALUE
是一个分析函数,它返回结果集中的第一个值。这里所说的”第一个值”是通过ORDER BY
语句确定的。如果在OVER
子句中没有指定ORDER BY
语句,则该函数返回结果集中的实际第一行。
基础语法如下:
FIRST_VALUE(expression)
OVER (
[PARTITION BY column1, column2,...]
ORDER BY column3, column4,...
)
这里的expression
通常是你想要从结果集中获取第一个值的列的名称。
例如,EMP表查询每个部门中每位员工的工资及部门中工资最高的。以下例子演示了如何使用 FIRST_VALUE
函数达成目标:
SELECT ename,
deptno,
sal,
FIRST_VALUE(ename) OVER (PARTITION BY deptno ORDER BY sal desc ) AS first_ENAME,
FIRST_VALUE(sal) OVER (PARTITION BY deptno ORDER BY sal desc) AS first_SAL
FROM emp;

在这个查询中,我们首先按 deptno
对人员进行分区,然后按sal
进行排序。然后,FIRST_VALUE
返回每个部门中的员工列表中工资最高的信息。
LAST_VALUE 函数
与FIRST_VALUE
相反,LAST_VALUE
函数返回结果集中的最后一个值。这里的”最后一个值”同样是通过ORDER BY
语句确定的。
基础语法如下:
LAST_VALUE(expression)
OVER (
[PARTITION BY column1, column2,...]
ORDER BY column3, column4,...
[ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING]
)
例如,EMP表查询每个部门中每位员工的工资及部门中工资最低的。以下例子演示了如何使用LAST_VALUE
函数来实现:
SELECT ename,
deptno,
sal,
LAST_VALUE(ename) OVER (PARTITION BY deptno ORDER BY sal desc ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) AS last_ENAME,
LAST_VALUE(sal) OVER (PARTITION BY deptno ORDER BY sal desc ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS last_SAL
FROM emp;

在这个查询中,我们首先按 deptno
对产品进行分区,然后按sal
进行排序。然后,LAST_VALUE
返回每个供应商的产品列表中价格最高的产品名。
需要注意的一点是,由于Oracle默认窗口在当前行结束,所以如果不使用 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
选项,你可能会得到意料之外的结果。这个选项确保在计算最后一个值时将整个分区考虑在内。
当然,上面所说的这种场景,不使用FIRST_VALUE
和LAST_VALUE
也是可以实现的,感兴趣的同学可以尝试敲一敲。
总结
FIRST_VALUE
和LAST_VALUE
函数提供了一种方便的方式,用于从分组的数据集中获取第一个或最后一个值。这些函数在诸如查找最大值、最小值或者特定范围内的值等场景中非常有用。
当你需要处理复杂的数据分析问题时,Oracle的分析函数就显得尤为重要。掌握了这些函数,你将能够更有效地查询和分析数据。
原文始发于微信公众号(运维小九九):SQL技巧:分析函数之FIRST_VALUE&LAST_VALUE
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/218414.html