首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Hive中的case语句填充前面的值

使用Hive中的case语句填充前面的值
EN

Stack Overflow用户
提问于 2018-09-25 18:46:53
回答 2查看 1.6K关注 0票数 1

我在event表中有一个列Hive,如下所示。

代码语言:javascript
复制
Event

Sent
Sent
Open
Open
Click
Sent
Open
Signup
Sent
Open
Click

现在,我希望使用case语句根据event列中的值创建新列。

我希望事件列中有signup,我希望Previous_event列恰好是preceding值。

我试过如下所示。

代码语言:javascript
复制
select event, 
       case when event = 'Sent' then 'No_event' 
            when event = 'Open' then 'Sent' 
            when event = 'Click' then 'Open'  
            else -1 
       end as Previous_event 
from table;

Result

代码语言:javascript
复制
Sent    No_event
Sent    No_event
Open    Sent
Open    Sent
Click   Open
Sent    No_event
Open    Sent
Signup  -1
Sent    No_event
Open    Sent
Click   Open

Expected result

代码语言:javascript
复制
Sent    No_event
Sent    No_event
Open    Sent
Open    Sent
Click   Open
Sent    No_event
Open    Sent
Signup  Open
Sent    No_event
Open    Sent
Click   Open

我怎样才能实现我想要的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-25 19:30:31

下面是包含类似问题/解决方案的URL:

Hive access previous row value

https://community.hortonworks.com/questions/39533/fill-null-with-previous-row-values-in-hive.html

SQL将是:

代码语言:javascript
复制
select event, prev_event(event) as Previous_event from table;

UDF的代码:

代码语言:javascript
复制
    import org.apache.hadoop.hive.ql.exec.UDF;

    public class cum_mul extends UDF  {
    private String prevValue = null;

    public String evaluate(String value) {

    switch(value) 
        { 
            case "Sent": 
        prevValue = "No_event";
                return "No_event"; 
            case "Open": 
        prevValue = "Sent";
                return "Sent";  
            case "Click": 
        prevValue = "Open";
                return "Open"; 
            default: 
                return prevValue; 
        } 
      }
}
票数 1
EN

Stack Overflow用户

发布于 2018-09-25 18:53:52

使用关联子查询。

基于OP's comments,您可以尝试以下查询(for MySQL):

代码语言:javascript
复制
select t1.event, 
       case when t1.event = 'Sent' then 'No_event' 
            when t1.event = 'Open' then 'Sent' 
            when t1.event = 'Click' then 'Open' 
            when t1.event = 'Signup' then (select t2.event 
                                           from table as t2 
                                           where t2.eventdate < t1.eventdate 
                                           order by t2.eventdate desc 
                                           limit 1)         
            else -1 
       end as Previous_event 
from table as t1;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52504910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档