2016-02-25 44 views
1

有人可以根據日期和站點名稱幫助識別連續停留。例如,對於下面的示例 -使用mysql識別連續停留

Name Start_Dt End_Dt   Site 
A  2015-01-07 2015-01-31  TSS 
A  2015-02-01 2015-02-28  TSS 
A  2015-03-01 2015-03-14  TSS 
A  2015-03-21 2015-03-31  TSS 
A  2015-04-01 2015-04-11  TSS 

預期輸出:

Name Start_Dt End_Dt   Site 
A  2015-01-07 2015-03-14  TSS 
A  2015-03-21 2015-04-11  TSS 

如果可能的話,我想留ID分配給輸出。謝謝!

回答

1

這個想法是確定相鄰停留的週期開始。你可以用left join來做這件事,看看前一天的住宿是否在前一天結束。

然後,在整天積累這個標誌提供了一個分組機制來識別相鄰的停留組。有了這些信息,剩下的只是聚合:

select name, site, min(start_dt), max(end_dt) 
from (select t.*, (case when t2.site is null then 1 else 0 end) as startFlag, 
      (@cnt := if(@s = site, @cnt + (case when t2.site is null then 1 else 0 end), 
         if(@s := site, 1, 1) 
         ) 
      ) as grp 
     from t left join 
      t t2 
      on t2.site = t.site and 
       t2.end_dt = date_sub(t.start_dt, interval 1 day) cross join 
      (select @s := '', @cnt := 0) params 
     order by site, start_dt 
    ) t 
group by name, site, grp 
+0

對不起,我對MySql相當陌生,因此無法理解這裏的查詢。你能解釋爲什麼有一個交叉連接。此外,我收到一條語法錯誤的行(@cnt:= if(@s:= site,@cnt +(case when t2.site is null then 0 else 1 end))謝謝! – user5104018

+0

嗨Gordon,再次感謝在執行子查詢時,選擇t。*,(t2.site爲空然後是0,否則爲1),作爲startFlag執行查詢,但我總是獲取一條記錄作爲輸出。 (@cnt:= if(@s:= t.site,@cnt +(當t2.site爲空然後0爲1時結束),if(@s:= t2.site,1,1)))as GRP ........爲了通過網站,start_dt,我得到的輸出如下 - – user5104018

+0

名稱\t start_Dt \t END_DT \t \t \t網站\t startFlag \t GRP一個\t 2015年1月7日\t 2015年1月31日TPS 甲\t \t 2015年2月1日2015年2月28日\t \t TSS 1 甲\t \t 2015年3月1日2015年3月14日\t \t TSS 1 甲\t 2015年3月21日\t \t 2015年3月31日TSS \t 甲\t \t 2015-04-01 2015年4月11日\t \t TSS 1 \t – user5104018