需要SQL查询以列出所有项目,这些项目具有在一段时间内开始但在该时间段结束时没有活动事件的事件

时间:2012-03-12 17:46:46

标签: sql datetime

我有一个表(在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

1 个答案:

答案 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