写点什么

YashanDB FIRST_VALUE 函数

作者:YashanDB
  • 2025-05-08
    广东
  • 本文字数:1856 字

    阅读完需:约 6 分钟

FIRST_VALUE 为窗口函数,并支持滑动窗口。本函数依据给定的窗口条件计算出窗口数据集合,并返回该集合的第一行记录所对应的expr的值。如果第一个值为 NULL 且未指定 IGNORE NULLS,则函数返回 NULL。

窗口函数不可嵌套,因此 expr 为除窗口函数之外的其他通用表达式,expr 的数据类型可以是 CLOB、BLOB、NCLOB、XMLTYPE、JSON、UDT 以外的其他数据类型。

(RESPECT|IGNORE) NULLS

指定 expr 的空值是否被包括在函数的计算中,缺省为 RESPECT NULLS,即如果集合中的第一个值为 NULL,函数将返回 NULL。

如果指定 IGNORE NULLS,则函数返回集合中的第一个非空值,当集合中所有值都为空时,返回 NULL。此设置对于数据密集化很有用。

示例

-- area1表中包含如下字段和数据SELECT area_no,area_name,DHQ,employee_count FROM area1;AREA_NO AREA_NAME            DHQ             EMPLOYEE_COUNT------- -------------------- --------------- --------------01      华东               Shanghai                      02      华西               Chengdu                    30003      华南               Guangzhou                  40004      华北               Beijing                    30005      华中               Wuhan                           
-- 返回按AREA_NO排序的每个窗口中的第一个EMPLOYEE_COUNT,windowing_clause省略时的默认窗口为UNBOUNDED PRECEDIN至CURRENT ROWSELECT FIRST_VALUE(employee_count) OVER(ORDER BY AREA_NO) res FROM area1; RES-------------------
-- 返回按AREA_NO排序的每个窗口中的第一个非空EMPLOYEE_COUNT,windowing_clause省略时的默认窗口为UNBOUNDED PRECEDIN至CURRENT ROWSELECT 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            28882021  01    0201           288882021  01    0101           388882021  02    0101           37778
--按年分组,并在每组记录中排名该年收入最高的机构SELECT year,revenue_total,FIRST_VALUE(branch) OVER (PARTITION BY year ORDER BY revenue_total DESC) frFROM 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) frFROM 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) frFROM finance_info;YEAR REVENUE_TOTAL FR----- ------------- -------------------- 2021 01 38888 0101 2021 02 37778 0101 2021 01 28888 0101 2001 01 2888 0201
复制代码


用户头像

YashanDB

关注

全自研国产新型大数据管理系统 2022-02-15 加入

还未添加个人简介

评论

发布
暂无评论
YashanDB FIRST_VALUE函数_YashanDB_InfoQ写作社区