首页 > 解决方案 > 如何根据hive中的时间顺序选择第一条和最后一条记录?

问题描述

我有一个两列的蜂巢表。第一列是时间,第二列是分散的物体。我希望得到所有在时间上连续的相同对象组,并获取第一条和最后一条记录。如何在蜂巢中实现这一点?

例如,我有一个这样的表:

id   time      object
1   10:01:00   a
2   10:02:00   a
3   10:03:00   a
4   10:04:00   b
5   10:05:00   b
6   10:06:00   a
7   10:07:00   a
8   10:08:00   a
9   10:09:00   a
10  10:10:00   a
11  10:11:00   c

我希望得到这个(因为对象'a'从 10:01:00 到 10:03:00 以及从 10:06:00 到 10:10:00 是连续的,所以 line1&line3 和 line6&line10 都被拾取):

id   time      object
1   10:01:00   a
3   10:03:00   a
4   10:04:00   b
5   10:05:00   b
6   10:06:00   a
10  10:10:00   a
11  10:11:00   c

我应该怎么做才能实现这一目标?

标签: sqlhivehiveql

解决方案


lag您可以分别使用和选择不等于上一行或不等于下一行的行lead。还需要检查第一行/最后一行以包含它们。

select id, time, object from 
(select *,
    (lead(object) over (order by time) != object or row_number() over (order by time desc) = 1) cond1, 
    (lag(object) over (order by time) != object or row_number() over (order by time) = 1) cond2
from table)
where cond1 or cond2;

推荐阅读