2016-04-02 5 views
5

を変更すると、テーブルでハイブ検索:私は取得するクエリを書きたい起動し、グループの終了またはここでのポイント

+------+------+ 
| 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 | 
+-------+--------+-----+ 

はそれを行う方法を誰もが知っていますか?

+3

これは、島の問題と呼ばれるお勧めします。私は 'HIVE'について知りませんが、' SQL Server'ではウィンドウ関数を使って解決します。 ** [DEMO](http://www.sqlfiddle.com/#!3/9eecb7db59d16c80417c72d1/6243)** –

+0

ありがとうございました! – GoGoGo

答えて

0

これは最も効率的な方法ではありませんが、これは機能します。

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; 
関連する問題