我有一个表(在MS Access中),它在每个记录中存储与项目关联的一个事件的开始和结束日期。多个事件可能与每个项目相关联,事件时间段可能会重叠。
我将使用术语“公开事件”来表示开始日期小于和结束日期大于给定日期的事件。
我想要一个查询,它给出了在给定时间段内至少有一个公开事件但在时间段结束时也有无打开事件的项目列表。理想情况下,我还想列出这些项目中每个项目的最后一次公开活动的ID。
这是一个事件记录列表,代表了我需要涵盖的一些案例。所涉及的时间段是2012-03-20至2012-03-30:
eventId itemId startDate endDate
e1 i1 2012-03-21 2012-03-23 -- event open entirely inside of time period
e2 i2 2012-03-19 2012-03-21 -- event open at start date
e3 i3 2012-03-29 2012-03-31 -- event open at end date
e4 i4 2012-03-19 2012-03-26 -- multi-event item with event open at end date
e5 i4 2012-03-22 2012-03-25
e6 i4 2012-03-29 2012-03-31
e7 i4 2012-04-01 2012-04-30
e8 i5 2012-03-19 2012-03-25 -- multi-event item with no events open at end date
e9 i5 2012-03-22 2012-03-29
e10 i5 2012-03-25 2012-03-26
e11 i5 2012-04-01 2012-04-30
e12 i6 2012-03-13 2012-03-19 -- event not in time period at all
以下是我希望通过此查询查看的项目(及其最后开放的事件):
i1, e1
i2, e2
i5, e9 -- note that e9.endDate > e8.endDate and e10.endDate, and that e11 falls after the time period in question, so is not considered the last event for the item
答案 0 :(得分:1)
您可以left join
到一个子查询,该子查询列出在结束日期打开的所有事件。如果要求子查询中的列为null,则排除与子查询匹配的所有事件/项组合。
select distinct e.eventId
, e.itemId
from Events e
left join
(
select distinct itemId
from Events
where startDate < '2012-03-30' -- Started before end
and '2012-03-30' < EndDate -- Closed after end
) oe
on e.itemId = oe.itemId
where e.startDate < '2012-03-30' -- Started before end
and '2012-03-20' < e.EndDate -- Ended after start
and oe.eventId is null -- Not open at end