简述头尾函数:FIRST_VALUE(expr),LAST_VALUE(expr) ?
参考回答
FIRST_VALUE 和 LAST_VALUE 是 Hive 中的头尾函数,用于在窗口函数操作中返回当前窗口中第一行和最后一行的值。
- FIRST_VALUE(expr):
FIRST_VALUE返回当前窗口中排序后的第一行数据。- 参数:
expr:需要查看的列。
- 示例:
SELECT FIRST_VALUE(salary) OVER (PARTITION BY department ORDER BY salary DESC) FROM employees;这个查询会返回每个部门中薪资最高的员工的薪资。
- LAST_VALUE(expr):
LAST_VALUE返回当前窗口中排序后的最后一行数据。- 参数:
expr:需要查看的列。
- 示例:
SELECT LAST_VALUE(salary) OVER (PARTITION BY department ORDER BY salary DESC) FROM employees;这个查询会返回每个部门中薪资最低的员工的薪资。
详细讲解与拓展
- FIRST_VALUE 函数的应用:
FIRST_VALUE通常用于获取某个排序窗口中的第一行数据。例如,你可能想要获取某个部门中薪资最高的员工,或者获取按时间排序的列表中的第一条记录。通过FIRST_VALUE函数,你可以快速找到窗口中的最小或最大值。- 举例:如果你想要获取每个部门薪资最高的员工:
SELECT department, FIRST_VALUE(salary) OVER (PARTITION BY department ORDER BY salary DESC) AS highest_salary FROM employees;这会返回每个部门薪资最高的员工薪资。
- LAST_VALUE 函数的应用:
LAST_VALUE用于获取窗口中的最后一行数据,通常应用于需要获取某个排序窗口中最后一个记录的场景。例如,按时间顺序排序后,获取最新的记录(在时间序列数据中)。- 举例:假设你有一个员工数据表,你想获取每个部门最后加入的员工的薪资:
SELECT department, LAST_VALUE(salary) OVER (PARTITION BY department ORDER BY hire_date DESC) AS latest_salary FROM employees;这个查询会返回每个部门最新入职员工的薪资。
- 窗口大小的影响:
- 在使用
FIRST_VALUE和LAST_VALUE时,窗口的大小和排序规则会影响返回的结果。如果没有特别指定窗口大小,默认窗口是整个数据集。为了避免窗口不受控制导致的问题,通常在OVER子句中使用适当的排序(如ORDER BY)和分区(如PARTITION BY)。 - 示例:在某些情况下,使用默认窗口可能导致返回的结果不是你想要的。为了确保正确性,可以使用
ROWS BETWEEN来明确指定窗口大小。SELECT FIRST_VALUE(salary) OVER (PARTITION BY department ORDER BY hire_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) FROM employees;
- 在使用
- 使用场景:
FIRST_VALUE和LAST_VALUE在处理排序和分组数据时非常有用,尤其是在需要提取特定记录(如第一条记录、最后一条记录)时。- 常见场景包括:获取分组中的最小或最大值,或者根据时间戳排序后提取最新或最早的记录。
总结
FIRST_VALUE和LAST_VALUE是用来提取窗口函数中排序后的第一行和最后一行的值的函数。- 它们可以在分组和排序后的数据中帮助你提取最重要的记录,常用于获取每组中的最早或最新数据,如薪资最高或最低的员工、最新的记录等。
- 这两个函数非常适合时间序列分析和数据的排序提取。