简述头尾函数: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 文档以了解具体的使用方法和行为。

发表评论

后才能评论