FIRST_VALUE
功能描述
FIRST_VALUE 是一个分析函数,它返回一个有序值集中的第一个值。
Vastbase在Oracle兼容模式下支持为FIRST_VALUE指定RESPECT NULLS或IGNORE NULLS选项,用于控制计算时是否忽略空值。指定IGNORE NULLS后,该函数会忽略返回空的值。此设置对数据密集化非常有用。
注意事项
RESPECT/IGNORE NULLS选项仅在数据库兼容模式为Oracle时支持(即数据库初始化时指定DBCOMPATIBILITY='A')。
语法格式
FIRST_VALUE
{ (expr) [ {RESPECT | IGNORE} NULLS ]
| (expr [ {RESPECT | IGNORE} NULLS ])
}
OVER (analytic_clause)
参数说明
expr
参与集合计算的表达式。
{ RESPECT | IGNORE } NULLS
决定expr的空值是否包含在计算中。
RESPECT NULLS:指定此选项时,expr的空值将包含在计算中。此时如果集合中的第一个值为NULL,则FIRST_VALUE函数返回NULL。该选项为缺省行为。
IGNORE NULLS:指定此选项时,expr的空值将从计算中消除。此时FIRST_VALUE返回集合中的第一个非空值,如果所有值都为空,则返回NULL。
OVER (analytic_clause)
窗口函数的计算范围(作用域)是OVER子句定义的数据行集合(即窗口)。该子句表示函数对分析子句analytic_clause的结果集进行查询。
分析子句中,可以通过PARTITION BY(分组)、ORDER BY(排序)等元素对窗口进行限制或过滤。
示例
1、创建用于测试的表并插入数据。
create table t_1199089(id int,dept_id int,col varchar2(10),col2 varchar2(10));
insert into t_1199089 values(1,1,'VAL1','CATE0');
insert into t_1199089 values(2,1,'VAL2','CATE0');
insert into t_1199089 values(3,1,NULL,'CATE0');
insert into t_1199089 values(4,1,NULL,'CATE0');
insert into t_1199089 values(5,1,NULL,'CATE0');
insert into t_1199089 values(6,2,'VAL6','CATE1');
insert into t_1199089 values(7,2,NULL,'CATE1');
insert into t_1199089 values(8,2,NULL,'CATE1');
insert into t_1199089 values(9,2,NULL,'CATE1');
2、进行数据查询时调用FIRST_VALUE函数,分别指定IGNORE NULLS或RESPECT NULLS。
SELECT id,dept_id,first_value(col IGNORE NULLS) over(partition by dept_id order by id) val,col2 FROM t_1199089;
SELECT id,dept_id,first_value(col) IGNORE NULLS over(partition by dept_id order by id) val,col2 FROM t_1199089;
SELECT id,dept_id,first_value(col RESPECT NULLS) over(partition by dept_id order by id) val,col2 FROM t_1199089;
SELECT id,dept_id,first_value(col) RESPECT NULLS over(partition by dept_id order by id) val,col2 FROM t_1199089;
SELECT id,dept_id,first_value(col) over(partition by dept_id order by id) val,col2 FROM t_1199089;
返回结果依次为:
id | dept_id | val | col2
----+---------+------+-------
1 | 1 | VAL1 | CATE0
2 | 1 | VAL1 | CATE0
3 | 1 | VAL1 | CATE0
4 | 1 | VAL1 | CATE0
5 | 1 | VAL1 | CATE0
6 | 2 | VAL6 | CATE1
7 | 2 | VAL6 | CATE1
8 | 2 | VAL6 | CATE1
9 | 2 | VAL6 | CATE1
(9 rows)
id | dept_id | val | col2
----+---------+------+-------
1 | 1 | VAL1 | CATE0
2 | 1 | VAL1 | CATE0
3 | 1 | VAL1 | CATE0
4 | 1 | VAL1 | CATE0
5 | 1 | VAL1 | CATE0
6 | 2 | VAL6 | CATE1
7 | 2 | VAL6 | CATE1
8 | 2 | VAL6 | CATE1
9 | 2 | VAL6 | CATE1
(9 rows)
id | dept_id | val | col2
----+---------+------+-------
1 | 1 | VAL1 | CATE0
2 | 1 | VAL1 | CATE0
3 | 1 | VAL1 | CATE0
4 | 1 | VAL1 | CATE0
5 | 1 | VAL1 | CATE0
6 | 2 | VAL6 | CATE1
7 | 2 | VAL6 | CATE1
8 | 2 | VAL6 | CATE1
9 | 2 | VAL6 | CATE1
(9 rows)
id | dept_id | val | col2
----+---------+------+-------
1 | 1 | VAL1 | CATE0
2 | 1 | VAL1 | CATE0
3 | 1 | VAL1 | CATE0
4 | 1 | VAL1 | CATE0
5 | 1 | VAL1 | CATE0
6 | 2 | VAL6 | CATE1
7 | 2 | VAL6 | CATE1
8 | 2 | VAL6 | CATE1
9 | 2 | VAL6 | CATE1
(9 rows)
id | dept_id | val | col2
----+---------+------+-------
1 | 1 | VAL1 | CATE0
2 | 1 | VAL1 | CATE0
3 | 1 | VAL1 | CATE0
4 | 1 | VAL1 | CATE0
5 | 1 | VAL1 | CATE0
6 | 2 | VAL6 | CATE1
7 | 2 | VAL6 | CATE1
8 | 2 | VAL6 | CATE1
9 | 2 | VAL6 | CATE1
(9 rows)
3、清理环境。
DROP TABLE t_1199089;