根据时间戳之间的间隔对时间戳进行分组

Fen*_*der 4 sql session select hive group-by

我在Hive(SQL)中有一个表,其中包含一堆时间戳,需要对这些时间戳进行分组,以便根据时间戳之间的时间差创建单独的会话.

示例:考虑以下时间戳(为简单起见,在HH:MM中给出): 9.00 9.10 9.20 9.40 9.43 10.30 10.45 11.25 12.30 12.33 等等.

所以现在,所有落在下一个时间戳30分钟内的时间戳都在同一个会话下,即9.00,9.10,9.20,9.40,9.43表格1会话.

但由于9.43和10.30之间的差异超过30分钟,时间戳10.30属于不同的会话.同样,10.30和10.45属于一个会议.

在我们创建了这些会话之后,我们必须获得该会话的最小时间戳和最大时间戳.

我尝试用LEAD减去当前时间戳,如果大于30分钟则放置一个标志,但我对此有困难.

你们的任何建议将不胜感激.如果问题不够清楚,请告诉我.

此样本数据的预期输出:

Session_start   Session_end
9.00                9.43
10.30               10.45
11.25               11.25 (same because the next time is not within 30 mins)
12.30               12.33
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.

Tho*_*ner 7

所以它不是MySQL而是Hive.我不知道Hive,但是如果它支持LAG,正如你所说,试试这个PostgreSQL查询.您可能需要更改时差计算,通常不同于一个dbms到另一个.

select min(thetime) as start_time, max(thetime) as end_time
from
(
  select thetime, count(gap) over (rows between unbounded preceding and current row) as groupid
  from
  (
    select thetime, case when thetime - lag(thetime) over (order by thetime) > interval '30 minutes' then 1 end as gap
    from mytable
  ) times
) groups
group by groupid
order by min(thetime);
Run Code Online (Sandbox Code Playgroud)

查询找到间隙,然后使用运行的间隙计数总数来构建组ID,其余的是聚合.

SQL小提琴:http://www.sqlfiddle.com/#!17 / 8bc4a / 6.