摘要:在本教程中,你将学习如何使用 SQL LEAD()
函数基于特定物理偏移来访问当前行后续的行的某行数据。
SQL LEAD() 函数概览
SQL LEAD()
是一个窗口函数,它提供对当前行后续特定物理偏移处的行的访问。
例如,使用 LEAD()
函数,你可以从当前行访问下一行的、当前行后续第二行的、当前行后续第三行的等等数据。
LEAD()
函数在计算当前行值与后续行值之间的差值时非常有用。
LEAD()
函数的语法如下:
LEAD(return_value [,offset[, default ]]) OVER (
PARTITION BY expr1, expr2,...
ORDER BY expr1 [ASC | DESC], expr2,...
)
Code language: SQL (Structured Query Language) (sql)
return_value
从当前行偏移后续行的返回值。
offset
从当前行向前访问数据的行数。offset
必须是非负整数。如果你不指定 offset
,则默认为 1。
default
如果 offset
超出了分区范围,则函数返回 default
。如果你不指定 default
,则返回 NULL
。
PARTITION BY 子句
PARTITION BY
子句将结果集中的行划分为 LEAD()
函数应用到的分区。如果你不指定 PARTITION BY
子句,则整个结果集被视为单个分区。
ORDER BY 子句
ORDER BY
子句对 LEAD()
函数应用到的每个分区中的行进行排序。
SQL LEAD() 函数示例
我们将在样本数据库中使用 employees
表进行演示。
A) 在结果集上使用 SQL LEAD() 函数的示例
以下语句为公司中的每位员工返回刚好在其后被雇用的员工的雇用日期
SELECT
first_name,
last_name,
hire_date,
LEAD(hire_date, 1) OVER (
ORDER BY hire_date
) AS next_hired
FROM
employees;
Code language: SQL (Structured Query Language) (sql)
以下显示所产生的输出

在这个例子中,我们省略了 PARTITION BY
子句,因此整个结果被视为单个分区。ORDER BY
子句按雇用日期升序对员工进行排序。LEAD()
函数应用于结果集中的每一行。
B) 在分区上使用 SQL LEAD() 函数的示例
以下语句为每个员工提供在同一部门中刚好在其后被雇用的员工的雇用日期
SELECT
first_name,
last_name,
department_name,
hire_date,
LEAD(hire_date, 1, 'N/A') OVER (
PARTITION by department_name
ORDER BY hire_date
) AS next_hire_date
FROM
employees e
INNER JOIN departments d ON
d.department_id = e.department_id;
Code language: SQL (Structured Query Language) (sql)
以下图片显示了部分输出

在这个例子中,我们使用 PARTITION BY
子句按部门将员工划分为分区,并使用 ORDER BY
子句按雇用日期升序对每个部门中的员工进行排序。LEAD()
函数独立地应用于每个经过排序的分区,以获取每个部门中员工的下一个雇用日期。
在本教程中,你已学习了如何使用 SQL LEAD()
函数来访问从当前行起的后续行的某行数据。