Улей Найти начало и конец группы или точку изменения

Вот таблица:

+------+------+
| Name | Time |   
+------+------+
| A    |    1 |   
| A    |    2 |   
| A    |    3 |   
| A    |    4 |   
| B    |    5 |   
| B    |    6 |   
| A    |    7 |   
| B    |    8 |   
| B    |    9 |   
| B    |   10 |   
+------+------+

Я хочу написать запрос, чтобы получить:

+-------+--------+-----+
| Name  | Start  | End |
+-------+--------+-----+
| A     |     1  |   4 |
| B     |     5  |   6 |
| A     |     7  |   7 |
| B     |     8  |  10 |
+-------+--------+-----+

кто нибудь знает как это сделать?


person GoGoGo    schedule 02.04.2016    source источник
comment
Это называется проблемой островов. Я не знаю насчет HIVE, но в SQL Server мы решаем это с помощью оконной функции. Вот DEMO   -  person Pரதீப்    schedule 02.04.2016


Ответы (1)


Это не самый эффективный способ, но он работает.

SELECT name, min(time) AS start,max(time) As end 
FROM (
   SELECT name,time, time- DENSE_RANK()  OVER (partition by name ORDER BY 
   time) AS diff
   FROM foo
) t 
GROUP BY name,diff;

Я бы предложил попробовать следующий запрос и создать GenericUDF для выявления пробелов, что намного проще :)

SELECT name, sort_array(collect_list(time)) FROM foo GROUP BY name;
person hlagos    schedule 12.01.2017