2017-07-04 42 views
4

我有一個紅移的需求,如果數據是連續的,我需要合併結果。我有下面的表,其中user_id,product_id是varchar和login_time,log_out_time是時間戳。紅移查詢合併結果,如果數據連續在一個表內

user_id product_id login_time    log_out_time 
---------------------------------------------------------------------- 
ashok  facebook  1/1/2017 1:00:00 AM  1/1/2017 2:00:00 AM 
ashok  facebook  1/1/2017 2:00:00 AM  1/1/2017 3:00:00 AM 
ashok  facebook  1/1/2017 3:00:00 AM  1/1/2017 4:00:00 AM 
ashok  linked_in 1/1/2017 5:00:00 AM  1/1/2017 6:00:00 AM 
ashok  linked_in 1/1/2017 6:00:00 AM  1/1/2017 7:00:00 AM 
ashok  facebook  1/1/2017 8:00:00 AM  1/1/2017 9:00:00 AM 
ram  facebook  1/1/2017 9:00:00 AM  1/1/2017 10:00:00 AM 
ashok  linked_in 1/1/2017 7:00:00 AM  1/1/2017 8:00:00 AM 

我需要的,如果該數據爲每個產品指定USER_ID連續的結果結合起來。所以,我的輸出應該看起來像,

user_id product_id login_time    log_out_time 
---------------------------------------------------------------------- 
ashok  facebook  1/1/2017 1:00:00 AM  1/1/2017 4:00:00 AM 
ashok  facebook  1/1/2017 8:00:00 AM  1/1/2017 9:00:00 AM 
ashok  linked_in 1/1/2017 5:00:00 AM  1/1/2017 8:00:00 AM 
ram  facebook  1/1/2017 9:00:00 AM  1/1/2017 10:00:00 AM 

我用下面的查詢嘗試,但它並沒有幫助我,

SELECT user_id, product_id, MIN(login_time), MAX(log_out_time) FROM TABLE_NAME GROUP BY user_id, product_id 

上面的查詢沒有給我所需的輸出,因爲它不具備檢查數據的邏輯是連續的。我需要爲此查詢而不使用任何自定義函數,但是我可以使用任何紅移內置函數。

回答

5

您可以使用lag(),以確定哪些羣體開始,然後累積和識別組,然後group by彙總結果:

select user_id, product_id, min(login_time), max(log_out_time) 
from (select t.*, 
      sum(case when prev_lt = login_time then 0 else 1 end) over 
       (partition by user_id, product_id 
        order by login_time 
        rows between unbounded preceding and current row 
       ) as grp 
     from (select t.*, 
        lag(log_out_time) over (partition by user_id, product_id order by login_time) as prev_lt 
      from t 
      ) t 
    ) t 
group by user_id, product_id, grp; 
+0

您的查詢沒有給出所需的輸出。如果我運行上面的查詢,它會給出相同的源表。我只是交換0和1,在這種情況下,它產生三行,但它不是所需的輸出。對於行ashok&臉書我得到單行作爲'ashok,facebook,2017/1/1 1:00:00,2017/1/1 4:00:00',但需要的輸出是'ashok,臉譜, 2017/1/1 1:00:00,2017年1月1日4:00:00,\ n ashok,facebook,2017/1/1 8:00:00 AM,2017/1/1 9:00 :00 AM'。需要的輸出在問題中可用,請看看。 – ashokramcse

+1

@ashokramcse。 。 。我的登錄/註銷時間相反。該查詢需要將當前登錄時間與以前的登出時間(現在正在執行的操作)進行比較。 –

+0

是你編輯的答案解決了我的謎團。順便說一句,你真是個天才!!! – ashokramcse