HIVE SQL将连续范围折叠成单行

Posted

技术标签:

【中文标题】HIVE SQL将连续范围折叠成单行【英文标题】:HIVE SQL Collapsing continuous ranges into single rows 【发布时间】:2018-05-10 20:26:08 【问题描述】:

考虑表中的以下记录:

NAME    ID      RATE   LOC   DAY
ABCD    123      -5    NYC    2017-01-01
ABCD    123      -5    NYC    2017-01-02
ABCD    123      -6    SFO    2017-01-03
ABCD    123      -6    DEN    2017-01-04
ABCD    345      -4    ATL    2017-01-05
ABCD    345      -4    WAS    2017-01-06
ABCD    123      -7    CLT    2017-01-07
ABCD    123      -7    CLT    2017-01-08

我想要一个类似的输出:

NAME    ID      RATE  LOC   START DAY   END DAY
ABCD    123      -5   NYC   2017-01-01  2017-01-02
ABCD    123      -6   SFO   2017-01-03  2017-01-03
ABCD    123      -6   DEN   2017-01-04  2017-01-04
ABCD    345      -4   ATL   2017-01-05  2017-01-05
ABCD    345      -4   WAS   2017-01-06  2017-01-06
ABCD    123      -7   CLT   2017-01-07  2017-01-08

如何在 SQL 或 HIVE 中执行此操作?我尝试使用 max over partition 和 row_number。它似乎不起作用。任何想法都非常感谢。

这是我试过的sql:

select *     
  from (
        select name
              ,id
              ,min(day) over (partition by name
                                          ,id) as start_date
              ,max(day) over (partition by name
                                          ,id) as end_date                     
              ,row_number () over (partition by name
                                               ,id
                                 order by day asc) as row1
          from table
       ) a
where row1=1;

【问题讨论】:

【参考方案1】:

这可以通过不同的行数方法来实现。要了解它的工作原理,请运行内部查询并查看结果。

select name,id,min(day),max(day)
from (select t.*,
      row_number() over(order by day)
      -row_number() over(partition by name,id order by day) as grp
      from tbl t
     ) t
group by name,id,grp

【讨论】:

非常感谢!!!工作完美。除了这 3 列之外,我还有其他几列。如果我将它们添加到选择和分组中,结果会发生变化。你知道解决办法吗? 在发布答案后更改问题是不公平的。 没有冒犯/不尊重。只是想为问题添加额外的上下文。我是堆栈溢出的新手。不知道这里的规矩。很抱歉。 @AS0207 在发布答案后对问题进行编辑是可以的,前提是该编辑实际上并未将问题更改为答案不相关/脱离上下文的程度。此外,如果提供的答案解决了您的问题,您可以将其标记为已接受,这样您自己就会获得更多声誉,回答者和任何未来的读者都知道答案有效

以上是关于HIVE SQL将连续范围折叠成单行的主要内容,如果未能解决你的问题,请参考以下文章

使用 Hive 中的值计算连续的日期范围

hive sql 经典题目 连续登陆|间隔连续登陆|行列转换|累加|topN | 炸裂

计算一个值在 Hive/SQL 中连续出现的次数

SQL查询将连续范围的数字分组到不同的分组集中

面试题: Hive-SQL查询连续活跃登录用户思路详解

面试题: Hive-SQL查询连续活跃登录用户思路详解