0


hive的first_value、last_value函数,可取非null值

1、原始数据准备

创建hive表、插入数据如下:

CREATE TABLE data (id INT, value INT);

INSERT INTO data (id, value) VALUES
    (1, NULL),
    (2, NULL),
    (3, NULL),
    (4, NULL),
    (5, 99),
    (6, NULL),
    (7, NULL),
    (8, 101),
    (9, NULL),
    (10, NULL);

查询数据

2、函数使用

1、函数说明:

first_value:函数用于返回当前第一个值。可开启true命令,跳过null值

last_value:函数用于返回当前最后个值。可开启true命令,跳过null值

select
       id,
       value,
       --1、取第一个值。null也正常取值
       first_value(value) over(order by id),
       --2、第一行到当前行,取第一个非null的值
       first_value(value,true) over(order by id ),
       --3、取当前行,到最后行,第一个非null值。
       --业务需求:取当前行之后的,最近的非null值
       first_value(value,true) 
       over(order by id rows between current row and unbounded following)
from data;

查询结果:

3、需求

战斗力连续:取近30天的数据,一个账号不是每天都登录,则需要用前后的数据进行填充。

使用窗口函数 LAST_VALUE 和 FIRST_VALUE 分别查找前面和后面最近非NULL值。

需求:某一行数据为null,按今日与登录日期的差值进行升序。本行为null,则往行数高的取,取最近的行数值。如果往高的没有,再往小的行数取,取行数最接近的值、如下面null值,需要填充

SELECT 
role_gid,
nd, --值为1、2、3、、、、28
    level_raw,
    battle_level_raw,
    coalesce(
    battle_level_raw,
        --取后面行第一个值(最接近)
        --函数含义:分组排序取组内第一个值.
        需求是:当前行的后面行的第一个值.true是忽略null值   否则跟原始值一样
    first_value(battle_level_raw,true  )  
        OVER(PARTITION BY role_gid ORDER BY nd  
        ROWS BETWEEN CURRENT ROW and UNBOUNDED FOLLOWING) ,
        取前面行最后值(最接近)
       --函数含义:分组排序取组内最后一个值.
        需求是:当前行的前面行的最后值.true是忽略null值   否则跟原始值一样
    last_value(battle_level_raw ,true ) 
        OVER(PARTITION BY role_gid ORDER BY nd  
        ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
    ) battle_level_notnull
    from  nd_game_sd_sjmy.tmp_dws_user_adventure_role_bat_detail_di  ;

有什么问题可以在后面提问哈,q15285610


本文转载自: https://blog.csdn.net/sinat_35197112/article/details/139394288
版权归原作者 符号本号 所有, 如有侵权,请联系我们删除。

“hive的first_value、last_value函数,可取非null值”的评论:

还没有评论