Нужен SQL-запрос, чтобы получить список всех элементов, которые имеют события, которые начинаются в течение определенного периода времени, но не имеют активных событий в конце периода - PullRequest
1 голос
/ 12 марта 2012

У меня есть таблица (в MS Access), в которой в каждой записи хранится дата начала и окончания одного события, связанного с элементом. С каждым элементом может быть связано несколько событий, и периоды времени события могут перекрываться.

Я буду использовать термин «открытое событие» для обозначения события с начальной датой меньше и конечной датой больше указанной даты.

Я бы хотел запрос, который дает мне список элементов, которые имели по крайней мере одно событие открытия в течение данного периода времени, но также имеют нет событий открытия в конце периода времени. В идеале я также хотел бы перечислить для каждого из этих элементов идентификатор последнего открытого события за период времени.

Вот список записей о событиях, которые представляют некоторые случаи, которые мне нужно было охватить. Рассматриваемый период времени с 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 Ответ

1 голос
/ 12 марта 2012

Вы можете left join в подзапрос, который перечисляет все события, которые открыты в конце даты. Если вы требуете, чтобы столбец из подзапроса был нулевым, вы исключаете все комбинации событий / элементов, которые соответствуют подзапросу.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...