有人可以根据日期和网站名称帮助识别连续住宿吗?例如,对于下面的示例 -
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 分配给输出。谢谢!
这个想法是确定相邻停留期的开始位置。 您可以通过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