2011-07-06 65 views
1

我需要查找在最近30天或更長時間沒有事件發生後發生的所有事件。我目前的查詢只能找到30天的第一個缺口。如果30天或更長時間沒有任何差距,那麼我使用默認日期返回所有行。T-SQL:30天差距後的最新事件

如果該事件比30天更舊,我還應該小心不要返回事件的單個實例。

考慮下面的事件,最近的事件最近最30天缺口後應該是6/30/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 
        ) 

回答

1

做出適合您的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 
1

試試這個:

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 
)