lvjw_lvjw 2019-02-26 20:25 采纳率: 0%
浏览 3398

如何使用hive sql 取两个时间?(详见问题描述)

数据片段如下

图片说明

需要求出红框中的间隔
图片说明

  • id time 状态 102 2019-02-24 17:18:18 1 102 2019-02-24 17:23:19 1 102 2019-02-24 17:28:19 1 102 2019-02-24 17:33:20 1 102 2019-02-24 17:38:20 1 102 2019-02-24 17:43:21 0 102 2019-02-24 17:48:21 0 102 2019-02-24 17:53:22 0 102 2019-02-24 17:58:22 1 102 2019-02-24 18:03:23 1 102 2019-02-24 18:08:23 1 102 2019-02-24 18:13:24 1 102 2019-02-24 18:18:24 0 102 2019-02-24 18:23:24 0 102 2019-02-24 18:28:25 0 102 2019-02-24 18:33:25 0 102 2019-02-24 18:38:26 0 102 2019-02-24 18:43:26 1 102 2019-02-24 18:48:27 1
  • 写回答

1条回答 默认 最新

  • Keifei 2019-02-27 16:09
    关注

    如果可以的话,我建议您用UDF更加方便,如果非要用hql呢,下面是我的想法

    首先,这是我准备的测试数据,如图,当中,方便计算,我就把时间那一列改了成了‘天’的粒度。
    图片说明
    然后,我增加一个自增序列的字段,别名是 num,如图
    图片说明
    在这个基础上呢,我取出状态是‘0’的数据,如图
    图片说明
    再在这个基础上,再增加一个自增序列字段,别名是 num2,如图
    图片说明
    数据处理到这里,帅哥,你是否有一点想法了呢?
    那我继续,再增加一个字段,别名是 groups,意为分组,逻辑就是 num - num2 !如图
    图片说明
    现在感觉怎么样?接下来就按照这个groups分组,取每组最大值和最小值相减,interval,完活!最后再来个图
    图片说明

    drop table test190227;
    create table test190227
    (
    id int,
    time date,
    state char(1)
    );
    
    set hive.exec.mode.local.auto=true;
    insert into test190227 select 102,to_date('2019-02-24'),'1';
    insert into test190227 select 102,to_date('2019-02-26'),'1';
    insert into test190227 select 102,to_date('2019-02-27'),'1';
    insert into test190227 select 102,to_date('2019-03-02'),'1';
    insert into test190227 select 102,to_date('2019-03-04'),'0';
    insert into test190227 select 102,to_date('2019-03-08'),'0';
    insert into test190227 select 102,to_date('2019-03-11'),'0';
    insert into test190227 select 102,to_date('2019-03-14'),'1';
    insert into test190227 select 102,to_date('2019-03-19'),'1';
    insert into test190227 select 102,to_date('2019-03-22'),'1';
    insert into test190227 select 102,to_date('2019-03-23'),'1';
    insert into test190227 select 102,to_date('2019-03-24'),'0';
    insert into test190227 select 102,to_date('2019-03-25'),'0';
    insert into test190227 select 102,to_date('2019-03-28'),'0';
    insert into test190227 select 102,to_date('2019-03-29'),'0';
    insert into test190227 select 102,to_date('2019-03-31'),'0';
    insert into test190227 select 102,to_date('2019-04-05'),'1';
    insert into test190227 select 102,to_date('2019-04-09'),'1';
    
    SELECT
     t.id,
     t.state,
     t.groups,
     datediff(max(t.time), min(t.time)) INTERVAL
    FROM
     (
      SELECT
       z.*, z.num - z.num2 groups
      FROM
       (
        SELECT
         p.*, row_number () over () num2
        FROM
         (
          SELECT
           a.*, row_number () over () num
          FROM
           test190227 a
          ORDER BY
           num DESC
         ) p
        WHERE
         p.state = '0' 
       ) z
     ) t
    GROUP BY
     t.id,
     t.state,
     t.groups;
    
    评论

报告相同问题?

悬赏问题

  • ¥15 关于logstash转发日志时发生的部分内容丢失问题
  • ¥17 pro*C预编译“闪回查询”报错SCN不能识别
  • ¥15 微信会员卡接入微信支付商户号收款
  • ¥15 如何获取烟草零售终端数据
  • ¥15 数学建模招标中位数问题
  • ¥15 phython路径名过长报错 不知道什么问题
  • ¥15 深度学习中模型转换该怎么实现
  • ¥15 Stata外部命令安装问题求帮助!
  • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
  • ¥15 如何用python向钉钉机器人发送可以放大的图片?