需要SQL查询来列出所有在某个时间段内开始但在该时间段结束时没有活动事件的项

需要SQL查询来列出所有在某个时间段内开始但在该时间段结束时没有活动事件的项,sql,datetime,Sql,Datetime,我在MS Access中有一个表,在每个记录中存储与项目相关的一个事件的开始和结束日期。每个项目可能关联多个事件,事件时间段可能重叠 我将使用术语“开放事件”来表示开始日期小于给定日期、结束日期大于给定日期的事件 我想要一个查询,该查询为我提供在给定时间段内至少有一个打开事件,但在该时间段结束时也没有打开事件的项目列表。理想情况下,我还想为这些项目中的每一项列出时间段中最后一个开放事件的id 这是一个事件记录列表,代表了我需要涵盖的一些案例。所述时间段为2012年3月20日至2012年3月30日

我在MS Access中有一个表,在每个记录中存储与项目相关的一个事件的开始和结束日期。每个项目可能关联多个事件,事件时间段可能重叠

我将使用术语“开放事件”来表示开始日期小于给定日期、结束日期大于给定日期的事件

我想要一个查询,该查询为我提供在给定时间段内至少有一个打开事件,但在该时间段结束时也没有打开事件的项目列表。理想情况下,我还想为这些项目中的每一项列出时间段中最后一个开放事件的id

这是一个事件记录列表,代表了我需要涵盖的一些案例。所述时间段为2012年3月20日至2012年3月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
您可以左键连接到列出在enddate打开的所有事件的子查询。如果要求子查询中的列为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
您可以左键连接到列出在enddate打开的所有事件的子查询。如果要求子查询中的列为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

这非常接近,类似于我迄今为止所能想到的最佳解决方案,但它还不够,因为结果集包含i4,但它不应该包含。我只想要在结束时没有打开事件的项。啊,但是如果做了以下更改,那么我认为它可以满足我的需要:在子查询中,选择“distinct itemId”而不是“select distinct eventId,itemId”,并且只在itemId上连接,而不是同时连接itemId和eventId@Andromar,如果你在这些更改中进行编辑,我会将其标记为解决方案。如果我们将你的原始代码留在那里,但注释掉,并附上一条注释,让人们参考下面的注释,你认为这会减少未来观众的困惑吗?可能不是。。。我会让你决定这非常接近,并且与我迄今为止所能想到的最好的解决方案相似,但是它不够,因为结果集包括i4,但它不应该。我只想要在结束时没有打开事件的项。啊,但是如果做了以下更改,那么我认为它可以满足我的需要:在子查询中,选择“distinct itemId”而不是“select distinct eventId,itemId”,并且只在itemId上连接,而不是同时连接itemId和eventId@Andromar,如果你在这些更改中进行编辑,我会将其标记为解决方案。如果我们将你的原始代码留在那里,但注释掉,并附上一条注释,让人们参考下面的注释,你认为这会减少未来观众的困惑吗?可能不是。。。我让你决定