HiveQL的时间间隔

时间:2016-12-11 15:35:52

标签: sql database hive hiveql

我有一个由两列组成的表,即时间和值列。 time列是一个浮点值,该值是一个字符串值。

我想将具有相同值的所有行组合在一起,其中时间列中两个值之间的距离最大为0.001并返回这些组的间隔。

实施例: 我的表格如下:

====================
|  time   | value  |
====================
|  0.001  | a      |
|  0.00001| a      |
|  0.002  | a      |
|  0.002  | b      |
|  0.003  | b      |
|  0.0031 | a      |
====================

期望的结果:

======================================
|  time_min   |  time_max  |  value  |
======================================
|  0.001      |  0.002     | a      |
|  0.002      |  0.003     | b      |
|  0.0031     |  0.0031    | a      |
======================================

是否有HiveQL查询执行此操作(尽可能高效)? Hive版本:1.2

提前多多感谢!

1 个答案:

答案 0 :(得分:0)

select      min(time)   as time_min
           ,max(time)   as time_max
           ,value       as value

from       (select      time
                       ,value

                       ,count(is_gap) over 
                        (   
                            partition by    value 
                            order by        time
                        )   as is_gap_seq

            from       (select      time
                                   ,value

                                   ,if 
                                    (
                                        time - lag(time) over 
                                            (partition by value order by time) > 0.001
                                       ,1
                                       ,null
                                    ) as is_gap

                        from        t
                        ) t
            ) t

group by    value
           ,is_gap_seq
;               

P.S。

  1. 我正在使用IF而不是CASE因为某些原因CASE会产生以下错误:

    失败:IndexOutOfBoundsException索引:2,大小:2

  2. 为此目的使用FLOAT是一个坏主意 它不会给你你期望的结果。