错位的梦寐

MySQL FIRST_VALUE()、LAST_VALUE() 函数概述

2020-03-22


FIRST_VALUE() 函数概述

FIRST_VALUE()是一个窗口函数,允许您选择窗口框架,分区或结果集的第一行。

以下说明了FIRST_VALUE()函数的语法:

FIRST_VALUE(expression) OVER (
        [partition_clause]
        [order_clause]
        [frame_clause]
) 

表达

FIRST_VALUE()函数返回expression窗口框架第一行的值。

OVER条款由三个条款:partition_clauseorder_clause,和frame_clause

partition_clause

partition_clause子句将结果集的行划分为函数独立应用的分区。partition_clause语法如下:

PARTITION BY expr1, expr2, ... 

order_clause

order_clause子句指定FIRST_VALUE()函数操作的每个分区中行的逻辑顺序。以下显示了以下语法order_clause

ORDER BY expr1 [ASC|DESC], expr2 [ASC|DESC], ... 

frame_clause

frame_clause定义当前分区的子集(或帧)

FIRST_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); 

1)FIRST_VALUE()在整个查询结果集示例中使用MySQL 函数

以下语句获取员工姓名,加班时间和加班时间最少的员工:

select employee_name,
       hours,
       first_value(employee_name) over (
           order by hours
           ) least_over_time
from overtime;

在此示例中,ORDER BY子句按结果集对行中的行进行了按小时排序,并FIRST_VALUE()选择了第一行,表示加班时间最短的员工。

2)FIRST_VALUE()在分区示例中使用MySQL

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

select employee_name,
       department,
       hours,
       first_value(employee_name) over (
           partition by department
           order by hours
           )least_over_time
from overtime;

在这个例子中:

  • 首先,PARTITION BY条款将员工按部门划分为分区。换句话说,每个分区由属于同一部门的员工组成。
  • 其次,ORDER BY子句指定了每个分区中的行顺序。
  • 第三,FIRST_VALUE()按小时排序对每个分区进行操作。它返回了每个分区中的第一行,分区是部门内加班时间最少的员工。

LAST_VALUE() 函数

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

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

LAST_VALUE (expression) OVER (
    [partition_clause]
    [order_clause]
    [frame_clause]
) 

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

OVER有三个子句:partition_clauseorder_clause,和frame_clause

partition_clause

partition_clause语法如下:

PARTITION BY expr1, expr2, ... 

PARTITION BY子句分配结果集成由一个或多个表达式指定多个分区expr1expr2LAST_VALUE()函数被独立地施加到每个分区。

order_clause

order_clause语法如下:

ORDER BY  expr1 [ASC|DESC],... 

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

frame_clause

frame_clause定义了所述当前分区的所述子集LAST_VALUE()函数应用。

LAST_VALUE() 函数示例

使用的数据仍然是上面建立的 table

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()函数选择了每个分区中的最后一行,分区是加班时间最高的员工。


Comments

Content