【发布时间】:2022-01-15 14:04:05
【问题描述】:
这可能属于“只要我知道它的正确名称,我就可以用谷歌搜索它”的类别,但这里是这样。
我有一个交叉活动时间表的表格,以及这些活动的排名。在删除每个排名较高的交叉点后,我需要获取每行的剩余时间范围。
我尝试将每一行与每个相交的行连接起来,但根据每个单独的交叉点调整开始和结束时间并不能考虑更高级别的交叉点。这是我在决定我可能在概念上接近这个错误之前所做的事情。
select
Activity
,rank
,case
when b.startTime <= a.startTime then b.endTime
when b.endtime >= a.endTime then b.starttime
else a.startTime
end as starttimeAdj
,case
when b.starttime <= b.startTime then a.endtime
when b.endtime >= a.endTime then b.starttime
else a.endTime
end as endtimeAdj
from myTable as a
left join myTable as b
on b.startTime< a.endTime
and b.endTime> a.startTime
and b.Activity!= a.Activity
and b.Rank<a.rank
where
b.segID is null or
not (b.starttime <= a.startTime and b.endtime >= a.endTime)
order by a.starttime,a.rank,b.starttime,b.rank
这是一个例子。这是起始数据:
Activity rank StartTime EndTime
Meeting 1 8:00 9:00
Startup 2 8:00 8:10
Shift 4 8:00 19:00
Break1 3 10:15 10:30
Break2 3 17:00 17:15
这就是我想要达到的目标:
Activity rank StartTime EndTime
Meeting 1 8:00 9:00
Shift 4 9:00 10:15
Break1 3 10:15 10:30
Shift 4 10:30 17:00
Break2 3 17:00 17:15
Shift 4 17:15 19:00
Startup 活动已消失,因为它完全包含在更高级别的活动中。 Shift 活动作为最低等级,已被与其相交的每个事物分割,只剩下不相交的时段。
按等级的视觉表示:
<--Meeting-->
<Startup>
<Break1> <Break2>
<-----------------------------------------------Shift------------------------------------>
变成
<--Meeting--><--Shift-><Break><-----------------Shift--------------------><Break><-Shift->
【问题讨论】:
-
这不是很清楚 - “需要结果”示例是原始数据吗?如果是这样的话,我真的不知道如何从那个例子中得到你想要的结果
-
谢谢,我澄清了一点,希望它更有意义。
-
这没有任何意义。您的示例数据非常模糊,以至于细节都消失了。
-
@Sean Lange 编辑了更多细节
-
这是一个空白和孤岛问题。
标签: sql-server ssms