Redshift 查询合并数据的结果在 table 内是连续的
Redshift query to combine result if the data are continous within a table
我在 redshift 中有一个要求,如果数据是连续的,我需要合并结果。我有以下 table,其中 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
上面的查询没有给出我需要的输出,因为它没有检查数据是否连续的逻辑。我需要在不使用任何自定义函数的情况下对此进行查询,但我可以使用任何 redshift 内置函数。
您可以使用 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;
我在 redshift 中有一个要求,如果数据是连续的,我需要合并结果。我有以下 table,其中 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
上面的查询没有给出我需要的输出,因为它没有检查数据是否连续的逻辑。我需要在不使用任何自定义函数的情况下对此进行查询,但我可以使用任何 redshift 内置函数。
您可以使用 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;