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)
希望这可以帮助.
所以它不是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.
归档时间: |
|
查看次数: |
940 次 |
最近记录: |