简述头尾函数:FIRST_VALUE(expr),LAST_VALUE(expr) ?
FIRST_VALUE(expr)
和 LAST_VALUE(expr)
是 SQL 中的窗口函数,用于在指定的窗口内检索表达式的第一个值和最后一个值。这些函数通常与 OVER()
子句一起使用,以定义窗口的范围和排序方式。在 Hive 和许多其他支持窗口函数的 SQL 数据库中,这些函数都是可用的。
FIRST_VALUE(expr)
FIRST_VALUE(expr)
函数返回在窗口排序后的第一行中表达式 expr
的值。窗口的排序是通过 ORDER BY
子句在 OVER()
函数中指定的。
例如,如果我们有一个包含员工薪水的表,并且我们想要获取每个部门薪水的最低值(假设每个部门的薪水都是唯一的),我们可以使用 FIRST_VALUE()
函数,如下所示:
SELECT dept, salary,
FIRST_VALUE(salary) OVER (PARTITION BY dept ORDER BY salary) as lowest_salary_in_dept
FROM employees;
在这个例子中,FIRST_VALUE(salary)
会在每个部门内部(由 PARTITION BY dept
指定)根据薪水排序(由 ORDER BY salary
指定)后的窗口内返回第一行的薪水值,即每个部门的最低薪水。
LAST_VALUE(expr)
LAST_VALUE(expr)
函数返回在窗口排序后的最后一行中表达式 expr
的值。与 FIRST_VALUE()
类似,窗口的排序是通过 ORDER BY
子句在 OVER()
函数中指定的。
然而,有一个重要的注意事项:在某些数据库系统中(包括一些版本的 Hive),LAST_VALUE()
函数可能不会按预期工作,因为它可能会返回当前行的值,而不是窗口中的最后一个值,除非与 ROWS BETWEEN
子句一起使用来明确指定窗口的范围。
为了确保 LAST_VALUE()
返回窗口中的最后一个值,你应该这样做:
SELECT dept, salary,
LAST_VALUE(salary) OVER (PARTITION BY dept ORDER BY salary ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) as highest_salary_in_dept
FROM employees;
在这个例子中,ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
指定了窗口范围,确保它包括从当前分区的第一行到最后一行的所有行。这样,LAST_VALUE(salary)
就会返回每个部门的最高薪水。
然而,请注意,如果你只关心最高或最低值,使用 MAX(expr)
或 MIN(expr)
函数通常会更简单、更直观,而且不需要担心窗口函数的复杂性。
在 Hive 的新版本中,对窗口函数的支持可能已经得到了改进,因此建议查阅最新的 Hive 文档以了解具体的使用方法和行为。