#FIRST_VALUE
FIRST_VALUE为窗口函数,并支持滑动窗口。该函数依据给定的窗口条件计算出窗口数据集合,并返回该集合的第一行记录所对应的expr的值。如果第一个值为NULL且未指定IGNORE NULLS,则函数返回 NULL。
窗口函数不可嵌套,因此expr为除窗口函数之外的其他通用表达式。
(RESPECT|IGNORE) NULLS
指定expr的空值是否被包括在函数的计算中,缺省为RESPECT NULLS,即如果集合中的第一个值为NULL,函数将返回NULL。
如果指定IGNORE NULLS,则函数返回集合中的第一个非空值,当集合中所有值都为空时,返回NULL。此设置对于数据密集化很有用。
示例
--使用手册首页列示的area1表
SELECT * FROM area1;
AREA_NO AREA_NAME DHQ EMPLOYEE_COUNT
------- -------------------- --------------- --------------
01 华东 Shanghai
02 华西 Chengdu 300
03 华南 Guangzhou 400
04 华北 Beijing 300
05 华中 Wuhan
--返回按AREA_NO排序的每个窗口中的第一个EMPLOYEE_COUNT,windowing_clause省略时的默认窗口为UNBOUNDED PRECEDIN至CURRENT ROW
SELECT FIRST_VALUE(employee_count) OVER(ORDER BY AREA_NO) res FROM area1;
RES
-------------------
--返回按AREA_NO排序的每个窗口中的第一个非空EMPLOYEE_COUNT,windowing_clause省略时的默认窗口为UNBOUNDED PRECEDIN至CURRENT ROW
SELECT FIRST_VALUE(employee_count IGNORE NULLS) OVER(ORDER BY AREA_NO) res FROM area1;
RES
-------------------
300
300
300
300
analytic_clause
窗口函数的通用语法。
在windowing_clause语句中无论指定的是ROWS还是RANGE,FIRST_VALUE都将对参数列进行排序,以保证在指定RANGE的情况下本函数返回值的稳定性(当order_by_clause具有相同排名,则函数返回相同排名下任意一行的值都是合理的,由此产生了返回值的不稳定性 ),但ROWS情况下仍会存在此不稳定性。
进行排序的参数列为:query_partition_clause中的expr 、order_by_clause中的排序列和FIRST_VALUE函数的参数expr。
示例
--finance_info表记录了分年、月、机构的收入情况
SELECT year,month,branch,revenue_total FROM finance_info;
YEAR MONTH BRANCH REVENUE_TOTAL
----- ----- ------ -------------
2001 01 0201 2888
2021 01 0201 28888
2021 01 0101 38888
2021 02 0101 37778
--按年分组,并在每组记录中排名该年收入最高的机构
SELECT year,revenue_total,
FIRST_VALUE(branch) OVER (PARTITION BY year ORDER BY revenue_total DESC) fr
FROM finance_info;
YEAR REVENUE_TOTAL FR
----- ------------- --------------------
2001 2888 0201
2021 38888 0101
2021 37778 0101
2021 28888 0101
--每月至今收入最高的机构
SELECT year,month,revenue_total,
FIRST_VALUE(branch) OVER (ORDER BY revenue_total DESC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) fr
FROM finance_info;
YEAR REVENUE_TOTAL FR
----- ------------- --------------------
2021 01 38888 0101
2021 02 37778 0101
2021 01 28888 0101
2001 01 2888 0101
--每月在三个月内收入最高的机构
SELECT year,month,revenue_total,
FIRST_VALUE(branch) OVER (ORDER BY revenue_total DESC ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) fr
FROM finance_info;
YEAR REVENUE_TOTAL FR
----- ------------- --------------------
2021 01 38888 0101
2021 02 37778 0101
2021 01 28888 0101
2001 01 2888 0201