MySQL NTH_VALUE Function

摘要:在本教程中,您将学习如何使用NTH_VALUE()函数从结果集中的第 N 行获取值。

NTH_VALUE()是一个窗口函数,允许您从有序行集中的第 N 行获取值。

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

NTH_VALUE(expression, N)
FROM FIRST
OVER (
    partition_clause
    order_clause
    frame_clause
)Code language: SQL (Structured Query Language) (sql)

NTH_VALUE()函数返回窗口框架第 N 行的expression值。如果第 N 行不存在,则该函数返回NULL 。 N 必须是正整数,例如 1、2 和 3。

FROM FIRST指示NTH_VALUE()函数从窗口框架的第一行开始计算。

请注意,SQL 标准支持FROM FIRSTFROM LAST 。但是,MySQL 仅支持FROM FIRST 。如果你想模拟FROM LAST的效果,那么你可以使用over_clause中的ORDER BY对结果集进行逆序排序。

MySQL NTH_VALUE()函数示例

我们将创建一个名为basic_pay新表用于演示。

CREATE TABLE basic_pays(
    employee_name VARCHAR(50) NOT NULL,
    department VARCHAR(50) NOT NULL,
    salary INT NOT NULL,
    PRIMARY KEY (employee_name , department)
);

INSERT INTO 
	basic_pays(employee_name, 
			   department, 
			   salary)
VALUES
	('Diane Murphy','Accounting',8435),
	('Mary Patterson','Accounting',9998),
	('Jeff Firrelli','Accounting',8992),
	('William Patterson','Accounting',8870),
	('Gerard Bondur','Accounting',11472),
	('Anthony Bow','Accounting',6627),
	('Leslie Jennings','IT',8113),
	('Leslie Thompson','IT',5186),
	('Julie Firrelli','Sales',9181),
	('Steve Patterson','Sales',9441),
	('Foon Yue Tseng','Sales',6660),
	('George Vanauf','Sales',10563),
	('Loui Bondur','SCM',10449),
	('Gerard Hernandez','SCM',6949),
	('Pamela Castillo','SCM',11303),
	('Larry Bott','SCM',11798),
	('Barry Jones','SCM',10586);Code language: SQL (Structured Query Language) (sql)

对结果集使用 MySQL NTH_VALUE()函数

以下语句使用NTH_VALUE()函数查找工资第二高的员工:

SELECT
    employee_name,
    salary,
    NTH_VALUE(employee_name, 2) OVER  (
        ORDER BY salary DESC
    ) second_highest_salary
FROM
    basic_pays;Code language: SQL (Structured Query Language) (sql)

这是输出:

MySQL NTH_VALUE Function Example

在分区上使用 MySQL NTH_VALUE()示例

以下查询查找每个部门中薪水第二高的员工:

SELECT
	employee_name,
	department,
	salary,
	NTH_VALUE(employee_name, 2) OVER  (
		PARTITION BY department
		ORDER BY salary DESC
		RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
	) second_highest_salary
FROM
	basic_pays;Code language: SQL (Structured Query Language) (sql)

这是输出:

MySQL NTH_VALUE Function OVER partition example

在此查询中,我们添加了PARTITION BY子句以按部门划分员工。然后NTH_VALUE()函数独立应用于每个分区。

在本教程中,您学习了如何使用 MySQL NTH_VALUE()函数从结果集的第 N 行获取值。

本教程有帮助吗?