红移查询合并结果,如果数据连续在一个表内

红移查询合并结果,如果数据连续在一个表内

问题描述:

我有一个红移的需求,如果数据是连续的,我需要合并结果。我有下面的表,其中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 

上面的查询没有给我所需的输出,因为它不具备检查数据的逻辑是连续的。我需要为此查询而不使用任何自定义函数,但是我可以使用任何红移内置函数。

您可以使用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