MySQL FIRST_VALUE Function

摘要:在本教程中,您将学习如何使用 MySQL FIRST_VALUE()函数获取帧、分区或结果集的第一行。

FIRST_VALUE()函数概述

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

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

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

在这个语法中:

表达

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

OVER子句由三个子句组成: partition_clauseorder_clauseframe_clause

partition_clause

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

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

order_clause

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

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

frame_clause

frame_clause定义当前分区的子集(或帧)。有关框架子句语法的详细信息,请查看窗口函数教程

MySQL 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);
Code language: SQL (Structured Query Language) (sql)

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

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

SELECT
    employee_name,
    hours,
    FIRST_VALUE(employee_name) OVER (
        ORDER BY hours
    ) least_over_time
FROM
    overtime;Code language: SQL (Structured Query Language) (sql)

这是输出:

MySQL FIRST_VALUE 函数示例

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

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

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

SELECT
    employee_name,
    department,
    hours,
    FIRST_VALUE(employee_name) OVER (
        PARTITION BY department
        ORDER BY hours
    ) least_over_time
FROM
    overtime;Code language: SQL (Structured Query Language) (sql)

输出是:

在这个例子中:

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

在本教程中,您学习了如何使用 MySQL FIRST_VALUE()函数获取窗口框架的第一行。

本教程有帮助吗?