MySQL LAST_VALUE函数
简介:在本教程中,您将学习如何使用MySQL LAST_VALUE()函数返回有序行集合中的最后一行。
MySQL LAST_VALUE()函数概述
LAST_VALUE()函数是一个窗口函数,允许您在有序行集合中选择最后一行。
下面显示了LAST_VALUE()函数的语法:
LAST_VALUE (expression) OVER ( [partition_clause] [order_clause] [frame_clause] )
LAST_VALUE()函数从一组已排序的行的最后一行返回表达式的值。
OVER子句具有三个子句:partition_clause,order_clause和frame_clause。
partition_clause
partition_clause具有以下语法:
PARTITION BY expr1, expr2, ...
PARTITION BY子句将结果集分布到一个或多个表达式expr1,expr2等指定的多个分区中。
LAST_VALUE()函数独立地应用于每个分区。
order_clause
order_clause具有以下语法:
ORDER BY expr1 [ASC|DESC],...
ORDER BY子句指定LAST_VALUE()函数在其上运行的分区中行的逻辑顺序。
frame_clause
frame_clause定义了LAST_VALUE()函数应用到的当前分区的子集。
有关frame_clause的更多详细信息,请在窗口函数教程中查看。
MySQL LAST_VALUE()函数示例
让我们设置一个示例表进行演示。
以下是用于创建加班表并将数据填充到表中的脚本。
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);
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;
输出为:
在此示例中,ORDER BY子句按小时从低到高的顺序指定了结果集中行的逻辑顺序。
默认的帧规范如下:
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
这意味着帧从结果集的第一行开始,到当前行结束。
因此,为了获得最长的加班时间,我们将框架规格更改为以下内容:
RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
这表示帧从结果集的第一行开始,到最后一行结束。
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;
下图显示了输出:
在此示例中,首先,PARTITION BY子句按部门划分员工。
然后,ORDER BY子句按从低到高的加班顺序对每个部门的员工进行排序。
在这种情况下,帧规范是整个分区。
结果,LAST_VALUE()函数选择了每个分区中的最后一行,这是加班时间最多的员工。
在本教程中,您学习了如何使用MySQL LAST_VALUE()函数获取有序行集合中的最后一行。