MySQL NTH_VALUE函数

时间:2019-11-20 08:52:27  来源:igfitidea点击:

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

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

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

NTH_VALUE(expression, N)
FROM FIRST
OVER (
    partition_clause
    order_clause
    frame_clause
)

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

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

请注意,SQL标准同时支持FROM FIRST和FROM 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);

在结果集上使用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;

这是输出:

在分区示例上使用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;

这是输出:

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

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