VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

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;