红移查询合并结果,如果数据连续在一个表内
问题描述:
我有一个红移的需求,如果数据是连续的,我需要合并结果。我有下面的表,其中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和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
@ashokramcse。 。 。我的登录/注销时间相反。该查询需要将当前登录时间与以前的登出时间(现在正在执行的操作)进行比较。 –
是你编辑的答案解决了我的谜团。顺便说一句,你真是个天才!!! – ashokramcse