2016-09-07 9 views
0

私のようなデータを持っています、各IDについてハイブ内の各IDのためにSQL

ID time 
1 9/6/2016 00:01:00 
1 9/6/2016 00:01:30 
1 9/6/2016 00:02:00 
1 9/6/2016 00:04:30 
1 9/6/2016 00:05:30 
1 9/6/2016 01:05:30 
1 9/6/2016 05:05:30 
1 9/6/2016 05:06:30 
2 9/6/2016 01:55:00 
2 9/6/2016 01:56:29 
2 9/6/2016 01:57:31 
2 9/6/2016 03:55:00 
2 9/6/2016 04:13:00 
2 9/6/2016 04:15:21 

を3分のグループを見つける、私は1にフラグと呼ばれる新しい変数を設定し、最初の値をチェックしたいです時間の。最初の値から、最初のエントリから3分以内にあるエントリをチェックし、すべてのものを1に設定したいと思います。タイムエントリが3分を超えると、フラグ変数を2に設定してから、もう一度設定しますその時間から3分以内にエントリをチェックしてください。これは、各IDについて続行する必要があります。 IDごとに3分のグループを探して、各IDのセットを作成できるようにしたい。

欲しい出力は、ID 1のためにここ

ID time    flag 
1 9/6/2016 00:01:00 1 
1 9/6/2016 00:01:30 1 
1 9/6/2016 00:02:00 1 
1 9/6/2016 00:04:30 2 
1 9/6/2016 00:05:30 2 
1 9/6/2016 01:05:30 2 
1 9/6/2016 05:05:30 2 
1 9/6/2016 05:06:30 2 
2 9/6/2016 01:55:00 1 
2 9/6/2016 01:56:29 1 
2 9/6/2016 01:57:31 1 
2 9/6/2016 03:55:00 2 
2 9/6/2016 04:13:00 3 
2 9/6/2016 04:15:21 3 

で、フラグセット1および3行目まで、3分のエントリをチェックし続け、それが3分以上であると、それは2に設定再び3分間のエントリのチェックを開始します。同様にID2も同様です。

次は、この1つは、テーブル全体のランキングされ

select ID, time, rank() over (order by time) as rank from table_name; 

、私が試したものです。私は思っている、我々は各IDのそれをランク付けし、最初の値を呼び出し、残りの値でそれを減算し、ここでサブクエリを書くことができます。

これを行うより効率的な方法はありますか?ここではHiveクエリを使用しています。どんな助けもありがとう。

答えて

0

サンプル出力が正しくありません。 ID = 1の場合、time = 01:05:30は00:05:30の1時間後ですが、両方のフラグが同じです。

ここには、Oracle SQLを排他的に使用するソリューションがあります。 「フラグの切り替え」の状態を確認してください。私が書いたやり方では、3分以上経過して初めて新しいフラグが立てられます。正確に3分が経過したときに新しいカウントを開始する場合は、最初の不等式を非厳密に、2番目の不等式を厳密に変更します。

解決策*は再帰的なファクタド・サブクエリを使用するため、Oracle 11.2以上が必要です。

*注:論理的に私は3 /(24 * 60)を引く必要はありません。代わりに、不等式は3 /(24×60)と比較する必要があります。これはOracle 12では機能しますが、ORA-00600を使用してOracle 11.2でデータベースをクラッシュしました。これは11.2(12.1で修正されています)の再帰的クエリのOracle実装における既知のバグのマーカーです。私は有料の顧客であるため、私自身バグ情報にアクセスすることはできません。私はOracle 11.2で以下に掲載したクエリをテストしましたが、単純化されたバージョンがクラッシュする間に動作します。どちらのバージョンも12.1で正常に動作しました。

with 
    inputs (id, time) as (
     select 1, to_date('9/6/2016 00:01:00', 'mm/dd/yyyy hh24:mi:ss') from dual union all 
     select 1, to_date('9/6/2016 00:01:30', 'mm/dd/yyyy hh24:mi:ss') from dual union all 
     select 1, to_date('9/6/2016 00:02:00', 'mm/dd/yyyy hh24:mi:ss') from dual union all 
     select 1, to_date('9/6/2016 00:04:30', 'mm/dd/yyyy hh24:mi:ss') from dual union all 
     select 1, to_date('9/6/2016 00:05:30', 'mm/dd/yyyy hh24:mi:ss') from dual union all 
     select 1, to_date('9/6/2016 01:05:30', 'mm/dd/yyyy hh24:mi:ss') from dual union all 
     select 1, to_date('9/6/2016 05:05:30', 'mm/dd/yyyy hh24:mi:ss') from dual union all 
     select 1, to_date('9/6/2016 05:06:30', 'mm/dd/yyyy hh24:mi:ss') from dual union all 
     select 2, to_date('9/6/2016 01:55:00', 'mm/dd/yyyy hh24:mi:ss') from dual union all 
     select 2, to_date('9/6/2016 01:56:29', 'mm/dd/yyyy hh24:mi:ss') from dual union all 
     select 2, to_date('9/6/2016 01:57:31', 'mm/dd/yyyy hh24:mi:ss') from dual union all 
     select 2, to_date('9/6/2016 03:55:00', 'mm/dd/yyyy hh24:mi:ss') from dual union all 
     select 2, to_date('9/6/2016 04:13:00', 'mm/dd/yyyy hh24:mi:ss') from dual union all 
     select 2, to_date('9/6/2016 04:15:21', 'mm/dd/yyyy hh24:mi:ss') from dual 
    ), 
    rec (id, time, flag, time_diff) as (
     select id, time, 1, 
       time - min(time) over (partition by id order by time) - 3/(24*60) 
     from inputs 
     union all 
     select id, time, flag + 1, 
       time - min(time) over (partition by id order by time) - 3/(24*60) 
     from rec 
     where time_diff > 0 
    ) 
select id, time, flag 
from  rec 
where time_diff <= 0 
order by id, time 
; 

出力

ID TIME      FLAG 
---- ------------------- ---------- 
    1 06/09/2016 00:01:00   1 
    1 06/09/2016 00:01:30   1 
    1 06/09/2016 00:02:00   1 
    1 06/09/2016 00:04:30   2 
    1 06/09/2016 00:05:30   2 
    1 06/09/2016 01:05:30   3 
    1 06/09/2016 05:05:30   4 
    1 06/09/2016 05:06:30   4 
    2 06/09/2016 01:55:00   1 
    2 06/09/2016 01:56:29   1 
    2 06/09/2016 01:57:31   1 
    2 06/09/2016 03:55:00   2 
    2 06/09/2016 04:13:00   3 
    2 06/09/2016 04:15:21   3 

14 rows selected 
1

DataFuのsessonize UDFを見ることができます。

また、利用できるさまざまなオプション(ハイブ、ブタ、Python)に関する素晴らしい投稿がhereです。

関連する問題