T-SQL: последнее событие после 30-дневного перерыва - PullRequest
1 голос
/ 06 июля 2011

Мне нужно найти все события, произошедшие после последнего перерыва в 30 дней или более, без события. Мой текущий запрос находит только первый разрыв в 30 дней. Если нет промежутков в 30 дней или более, я использую дату по умолчанию, чтобы вернуть все строки.

Я также должен быть осторожен, чтобы не возвращать ни одного экземпляра события, если это событие старше 30 дней.

Учитывая следующие события, самое последнее событие после последнего 30-дневного разрыва должно быть 30.06.2011, но мой запрос возвращает 4/13/2011

EventDate    EventType
=========    =========
4/13/2011    1
5/20/2011    1
6/30/2011    1

DECLARE @DefaultDate DATETIME 
SET @DefaultDate = '1/1/2011'

SELECT ISNULL(MAX(EventDate), @DefaultDate) 
FROM Events e 
WHERE 
    e.EventType = 1
    AND NOT EXISTS (SELECT 1 
                    FROM Events
                    WHERE  EventType = 1
                    AND DATEDIFF(dd,EventDate, e.EventDate) ) > 30
                   )

Ответы [ 2 ]

1 голос
/ 06 июля 2011

Попробуйте это:

declare @t table(EventDate datetime)

insert @t(EventDate) values('4/13/2011'), ('5/20/2011'), ('6/30/2011'), ('7/1/2011')

select *
from @t
where EventDate >
(
    select max(t1.EventDate)
    from @t t1
    join @t t2 ON t2.EventDate > t1.EventDate
        and not exists (
            select 1
            from @t t3
            where t3.EventDate < t2.EventDate and t3.EventDate > t1.EventDate
        )
    where datediff(day, t1.EventDate, t2.EventDate) > 30
)
1 голос
/ 06 июля 2011

Сделано для вашего sql.Исправлено недоразумение

SELECT COALESCE(t1.Eventdate, @DefaultDate) from event t1
RIGHT JOIN
(
SELECT max(EventDate) EventDate FROM event t 
WHERE EventType = 1 AND 
 NOT EXISTS 
(SELECT 1 FROM event WHERE EventType = 1 AND
t.eventdate <= eventdate + 30 and t.eventdate > eventdate)
AND EXISTS (SELECT 1 FROM event WHERE EventType = 1
 AND t.eventdate > eventdate)) t2
 on t1.eventdate >= t2.eventdate
...