2016-04-28 78 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; 

此方法不適用於所有數據。特別是,它假設用戶沒有重複的開始時間。它也可以通過複雜的多重重疊獲得時髦感。但是,在很多情況下,這個邏輯確實有用。