MySQL LAST_VALUE Function

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

MySQL LAST_VALUE()函数概述

LAST_VALUE()函数是一个窗口函数,允许您选择有序行集中的最后一行。

下面显示了LAST_VALUE()函数的语法:

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

LAST_VALUE()函数返回已排序行集最后一行的expression值。

OVER子句具有三个子句: partition_clauseorder_clauseframe_clause

partition_clause

partition_clause具有以下语法:

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

PARTITION BY子句将结果集分布到由一个或多个表达式expr1expr2等指定的多个分区中LAST_VALUE()函数独立应用于每个分区。

order_clause

order_clause具有以下语法:

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

ORDER BY子句指定LAST_VALUE()函数操作的分区中行的逻辑顺序。

 frame_clause

frame_clause定义了LAST_VALUE()函数应用的当前分区的子集。有关frame_clause的更多详细信息,请查看窗口函数教程

MySQL LAST_VALUE()函数示例

让我们设置一个示例表进行演示。

以下是创建overtime表并将数据填充到表中的脚本。

CREATE TABLE overtime (
    employee_name VARCHAR(50) NOT NULL,
    department VARCHAR(50) NOT NULL,
    hours INT NOT NULL,
     PRIMARY KEY (employee_name , department)
);
INSERT INTO overtime(employee_name, department, hours)
VALUES('Diane Murphy','Accounting',37),
('Mary Patterson','Accounting',74),
('Jeff Firrelli','Accounting',40),
('William Patterson','Finance',58),
('Gerard Bondur','Finance',47),
('Anthony Bow','Finance',66),
('Leslie Jennings','IT',90),
('Leslie Thompson','IT',88),
('Julie Firrelli','Sales',81),
('Steve Patterson','Sales',29),
('Foon Yue Tseng','Sales',65),
('George Vanauf','Marketing',89),
('Loui Bondur','Marketing',49),
('Gerard Hernandez','Marketing',66),
('Pamela Castillo','SCM',96),
('Larry Bott','SCM',100),
('Barry Jones','SCM',65);
Code language: SQL (Structured Query Language) (sql)

1) MySQL LAST_VALUE()对整个查询结果示例

以下语句获取员工姓名、加班时间以及加班时间最长的员工:

SELECT
    employee_name,
    hours,
    LAST_VALUE(employee_name) OVER (
        ORDER BY hours
        RANGE BETWEEN
            UNBOUNDED PRECEDING AND
            UNBOUNDED FOLLOWING
    ) highest_overtime_employee
FROM
    overtime;Code language: SQL (Structured Query Language) (sql)

输出是:

MySQL LAST_VALUE function example

在此示例中, ORDER BY子句指定结果集中行的逻辑顺序按小时从低到高。

默认的框架规格如下:

RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROWCode language: SQL (Structured Query Language) (sql)

这意味着帧从结果集的第一行开始,到结果集的当前行结束。

因此,为了获得加班时间最高的员工,我们将框架规范更改为以下内容:

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

这表示帧从结果集的第一行开始,到最后一行结束。

2) MySQL LAST_VALUE()分区示例

以下语句查找每个部门中加班时间最多的员工:

SELECT
    employee_name,
    department,
    hours,
    LAST_VALUE(employee_name) OVER (
		PARTITION BY department
        ORDER BY hours
        RANGE BETWEEN
	    UNBOUNDED PRECEDING AND
            UNBOUNDED FOLLOWING
	) most_overtime_employee
FROM
    overtime;Code language: SQL (Structured Query Language) (sql)

下图显示了输出:

MySQL LAST_VALUE Function OVER partitions example

在此示例中,首先, PARTITION BY子句按部门划分员工。然后, ORDER BY子句对每个部门的员工按加班时间从低到高进行排序。

本例中的框架规范是整个分区。结果, LAST_VALUE()函数选择了每个分区中的最后一行,即加班时间最长的员工。

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

本教程有帮助吗?