美文网首页
Hive SQL - 复制最后一个非空值 The Last no

Hive SQL - 复制最后一个非空值 The Last no

作者: 屹然1ran | 来源:发表于2021-08-25 16:47 被阅读0次

1. 启发

在业务上,我们常常会碰到这样的需求
例如原始表如下:

uid state time
a 1 0
a null 1
a null 2
a 3 3
b null 4
b 2 5
b null 6

需要变成如下:

uid state time
a 1 0
a 1 1
a 1 2
a 3 3
b null 4
b 2 5
b 2 6

简单来讲就是,对所有空值,复制每个分组下排序后的最后一个非空值,这种需求也叫做The Last non-NULL Puzzle。对于这种问题,pandasffill函数可以简单轻易的解决这个问题,但是在SQL中就没这么畅快了。

对与这个问题有多个解法,以下是笔者找到的一种,作为抛砖引玉

代码如下:

select 
  uid
  , coalesce(last_value(state, true) over(partition by uid order by time rows between unbounded preceding and current row)) state
  , time
from values
('a', 1, 0), 
('a', null, 1), 
('a', null, 2), 
('a', 3, 3) , 
('b', null, 4), 
('b', 2, 5), 
('b', 2, 6)
as tab(uid, state, time);

/*
output:
uid state2  time
a   1   0   
a   1   1   
a   1   2   
a   3   3   
b   NULL    4   
b   2   5   
b   2   6   
*/

解释:
over()开窗函数中,unbounded preceding and current row表示从第一行到目前这一行
last_value()表示取一个数组中的最后一个值
coalesce()表示聚合一个数组,剔除所有的空值

2. 拓展

在Hive中,SQL中额外添加了一些函数:

2.1 开窗函数中的聚合函数
  • LEAD() 返回分组中的上一个值
  • LAG() 返回分组中的下一个值
  • FIRST_VALUE() 返回分组中的第一个值
  • LAST_VALUE() 返回分组中的最后一个值
2.2 OVER() 表达式中

OVER()中开窗,可以使用ROWS表达式子分别对行进行选择/RANGE表达式对范围进行选择,例如:

(ROWS | RANGE) BETWEEN (UNBOUNDED | [num]) PRECEDING AND ([num] PRECEDING | CURRENT ROW | (UNBOUNDED | [num]) FOLLOWING)
(ROWS | RANGE) BETWEEN CURRENT ROW AND (CURRENT ROW | (UNBOUNDED | [num]) FOLLOWING)
(ROWS | RANGE) BETWEEN [num] FOLLOWING AND (UNBOUNDED | [num]) FOLLOWING

reference:
https://cwiki.apache.org/confluence/display/hive/languagemanual+windowingandanalytics

相关文章

  • Hive SQL - 复制最后一个非空值 The Last no

    1. 启发 在业务上,我们常常会碰到这样的需求例如原始表如下: uidstatetimea10anull1anul...

  • Hive SQL 空值替换 nvl()

    基础语法: nvl(表达式1,表达式2) 如果表达式1为空值,nvl返回值为表达式2的值,否则返回表达式1的值。注...

  • sql主键

    SQL 的主键和外键的作用: 外键取值规则:空值或参照的主键值 (1)插入非空值时,如果主键值中没有这个值,则不能...

  • SQL的主键和外键约束详解及用途

    SQL的主键和外键的作用: 外键取值规则:空值或参照的主键值。 (1)插入非空值时,如果主键表中没有这个值,则不能...

  • SQL的主键和外键约束

    SQL的主键和外键的作用: 外键取值规则:空值或参照的主键值。 (1)插入非空值时,如果主键表中没有这个值,则不能...

  • Hive:分区表表结构和数据复制

    摘要:Hive,Shell Hive表复制语句 Hive复制表包括两种 复制表结构:只复制表结构到一个新表,新表没...

  • SQL——空值

    空值给关系运算带来了特殊的问题,包括算术运算、比较运算、集合运算。 对算术运算的问题:如果算术表达式的任一输入为空...

  • 第二十九章 SQL函数 COALESCE

    第二十九章 SQL函数 COALESCE 返回第一个非空表达式的值的函数。 大纲 expression - 要计算...

  • Hive Sql case when 不支持子查询

    how to make selecet subquery in hive sql 怎么在 hive sql 中实现...

  • excel学习—让你事半功倍之二

    指定区域最后一个非空值查找方法 截取_前的部分 微信号:舟游神州

网友评论

      本文标题:Hive SQL - 复制最后一个非空值 The Last no

      本文链接:https://www.haomeiwen.com/subject/leefrltx.html