我一直在寻找答案,但我找不到一个完全符合我问题的答案。
我想要找到的是之前“剧集”的起点和终点以及这些“剧集”之间的差距持续时间(如果适用)。我添加了一个链接到我在SQL Fiddle上创建的一些示例数据,我试图尽可能地复制数据。
剧集的定义是什么?剧集开始于某个时间点只有一个开放事件,最后一个事件结束时结束。每个人在一段时间内可以有多个“剧集”。
我报告的表包含父数据和子数据,而不是需要识别父项或子项,但数据有点乱,例如有关闭的父记录,其子记录仍然打开。有很多重叠日期(有时用peculator方式)。
我迷失在迷宫般的陈述中!!
非常感谢任何帮助!
如果需要更多背景信息,请询问!
提前致谢!
答案 0 :(得分:0)
我自己设法解决了这个问题,我创建了下面的表函数,每个人都会产生上一集的结束日期和下一集的开始日期,其中有一个空白:
CREATE FUNCTION fun_tbl_find_gaps_in_referrals
(
@v_person_id int
)
RETURNS
@gaps TABLE
(
end_date smalldatetime,
start_date smalldatetime
)
AS
BEGIN
insert into @gaps
select distinct
e1.end_date,
e2.start_date
from
EVENTS e1
join EVENTS e2
on e1.end_date < e2.start_date
and e1.person_id = @v_person_id
and e2.start_date =
(select
MIN(start_date)
from
EVENTS e3
where
e3.start_date > e1.end_date
and person_id = @v_person_id)
and not exists
(select
*
from
EVENTS e
where
e.start_date < e1.end_date
and e.end_date > e1.end_date
and e.person_id = @v_person_id)
RETURN
END
只需使用 DATEDIFF 函数计算两个日期之间的持续时间。
select distinct
person_id,
gaps.end_date,
gaps.start_date,
datediff(day,gaps.end_date,gaps.start_date) as duration
from
EVENTS evnt
cross apply fun_tbl_find_gaps_in_referrals(evnt.person_id) gaps
这是Fiddle。