SQL LAST_VALUE

摘要:在本教程中,您将学习如何使用 SQL LAST_VALUE() 函数来返回有序值集合中的最后一个值。

LAST_VALUE() 函数概述

LAST_VALUE() 是一种窗口函数,它返回有序值集合中的最后一个值。

下文说明了 LAST_VALUE() 函数的语法

LAST_VALUE(expression) OVER (
    partition_clause
    order_clause
    frame_clause
)
Code language: SQL (Structured Query Language) (sql)

此语法中

expression

函数的返回值,可以是列或结果为单一值的表达式。

OVER 子句包含三个子句:partition_clauseorder_clauseframe_clause

partition_clause

partition_clause 子句的语法如下

PARTITION BY expr1, expr2, ...
Code language: SQL (Structured Query Language) (sql)

PARTITION BY 子句将结果集的行划分为分区,LAST_VALUE() 函数应用于这些分区。由于 PARTITION BY 子句是可选的,因此如果您省略它,该函数将把整个结果集视为一个分区。

order_clause

order_clause 子句指定了 LAST_VALUE() 函数应用到的分区中行的顺序。ORDER BY 子句的语法如下

ORDER BY expr1 [ASC | DESC], expr2, ...
Code language: SQL (Structured Query Language) (sql)

frame_clause

frame_clause 定义了正在评估的分区的子集(或框架)。有关框架子句的详细信息,请参阅 窗口函数教程

SQL LAST_VALUE() 函数示例

我们将使用 示例数据库 中的以下 employeesdepartments 表进行演示。

Employees & Departments Tables

A) 通过结果集使用 SQL LAST_VALUE() 函数的示例

以下语句查找公司中薪水最高的人员

SELECT
    first_name,
    last_name,
    salary,
    LAST_VALUE (first_name) OVER (
        ORDER BY salary
        RANGE BETWEEN UNBOUNDED PRECEDING AND 
        UNBOUNDED FOLLOWING
    ) highest_salary
FROM
    employees;
Code language: SQL (Structured Query Language) (sql)

以下是部分输出

在此示例中,ORDER BY 子句按薪水对员工进行排序,而 LAST_VALUE() 则选择薪水最低的员工的名字。

框架子句如下

RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
Code language: SQL (Structured Query Language) (sql)

这意味着从第一行开始(UNBOUNDED PRECEDING),到最后一行的框架 (UNBOUNDED FOLLOWING) 结果集。

B) 通过分区使用 SQL LAST_VALUE() 的示例

以下语句查找各部门薪水最高的人员。

SELECT
    first_name,
    last_name,
    department_name,
    salary,
    LAST_VALUE (CONCAT(first_name,' ',last_name)) OVER (
        PARTITION BY department_name
        ORDER BY salary
        RANGE BETWEEN UNBOUNDED PRECEDING AND 
        UNBOUNDED FOLLOWING
    ) highest_salary
FROM
    employees e
    INNER JOIN departments d 
        ON d.department_id = e.department_id;
Code language: SQL (Structured Query Language) (sql)

下图显示了查询的输出

SQL LAST_VALUE Function Over Partition Example

让我们更详细地检查该查询

  • 首先,PARTITION BY 子句按部门划分员工。
  • 然后,ORDER BY 子句按升序对每个部门的员工进行排序。
  • 最后,将 LAST_VALUE() 应用于每个分区中的已排序行。由于该框架从第一行开始并且在每个分区的最后一行结束,因此 LAST_VALUE() 选择了薪水最高的人员。

在本教程中,您学习了如何使用 SQL LAST_VALUE() 函数来获取有序值集合中的最后一个值。

本教程有帮助吗?