SQL技巧:分析函数之FIRST_VALUE&LAST_VALUE

Oracle数据库提供了一系列强大的分析函数,其中包括FIRST_VALUELAST_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 descAS first_SAL
FROM emp;
SQL技巧:分析函数之FIRST_VALUE&LAST_VALUE
图1 FIRST_VALUE

在这个查询中,我们首先按 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 FOLLOWINGAS last_SAL
FROM emp;
SQL技巧:分析函数之FIRST_VALUE&LAST_VALUE
图2 last_value

在这个查询中,我们首先按 deptno 对产品进行分区,然后按sal 进行排序。然后,LAST_VALUE 返回每个供应商的产品列表中价格最高的产品名。

需要注意的一点是,由于Oracle默认窗口在当前行结束,所以如果不使用 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING 选项,你可能会得到意料之外的结果。这个选项确保在计算最后一个值时将整个分区考虑在内。

当然,上面所说的这种场景,不使用FIRST_VALUELAST_VALUE 也是可以实现的,感兴趣的同学可以尝试敲一敲。

总结

FIRST_VALUELAST_VALUE函数提供了一种方便的方式,用于从分组的数据集中获取第一个或最后一个值。这些函数在诸如查找最大值、最小值或者特定范围内的值等场景中非常有用。

当你需要处理复杂的数据分析问题时,Oracle的分析函数就显得尤为重要。掌握了这些函数,你将能够更有效地查询和分析数据。


原文始发于微信公众号(运维小九九):SQL技巧:分析函数之FIRST_VALUE&LAST_VALUE

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/218414.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!