2016-04-28 47 views
0

我有用户访问的表等这样的:有条件集合行

SELECT * FROM visits ORDER BY start_time; 

user_id |  start_time  |  end_time 
---------+---------------------+--------------------- 
     10 | 2016-06-01 05:45:00 | 2016-06-01 06:00:00 
     10 | 2016-06-01 06:05:00 | 2016-06-01 06:30:00 
     10 | 2016-06-01 06:10:00 | 2016-06-01 06:40:00 
     10 | 2016-06-02 10:00:00 | 2016-06-01 10:30:00 
     10 | 2016-06-03 13:00:00 | 2016-06-01 14:00:00 

我想“合并”行,其中所述访问重叠,或者有10分钟内彼此,像这样:

user_id |  start_time  |  end_time 
---------+---------------------+--------------------- 
     10 | 2016-06-01 05:45:00 | 2016-06-01 06:40:00 
     10 | 2016-06-02 10:00:00 | 2016-06-01 10:30:00 
     10 | 2016-06-03 13:00:00 | 2016-06-01 14:00:00 
  • 第一3行中,因为前两行合并成1彼此和第三行的5分钟(少于10分钟)内重叠第二
  • 最后三个行s是没有改变,因为没有行是在10分钟内

我不认为这是可能的使用GROUP BY因为每个行的分组函数返回值将取决于多行。我在想窗口函数可以帮助,但一直在努力构建查询。

我使用AWS Redshift

感谢您的帮助!

回答

0

您可以使用窗口/分析函数。我认为这个版本适用于您的数据:

select user_id, min(start_time) as start_time, max(end_time) as end_time 
from (select t.*, 
      sum(case when start_time > prev_end_time + interval '10' minute 
         then 1 else 0 
       end) over (partition by user_id order by start_time) as grp 
     from (select t.*, 
        lag(end_time) over (partition by user_id order by start_time) as prev_end_time 
      from t 
      ) t 
    ) t 
group by grp, user_id; 

此方法不适用于所有数据。特别是,它假设用户没有重复的开始时间。它也可以通过复杂的多重重叠获得时髦感。但是,在很多情况下,这个逻辑确实有用。