2016-05-19 3 views
1

Ich muss eine SQL-Abfrage erstellen, die eine Tabelle auffüllt, wenn jemand 3 Mal oder öfter in einem Zeitraum von 3 Monaten war.3 Strikes Query SQL 2008

Die Daten, die ich mir zur Verfügung haben, ist:

SELECT 'John Doe' AS Name, 1406 AS InstanceID, '2016-01-08 00:00:00.000' AS AbsenceStart, '2016-01-13 00:00:00.000' AS AbsenceEnd, 4 AS NoOfDays, 1 AS rnk 
UNION ALL 
SELECT 'John Doe' AS Name, 1493 AS InstanceID, '2016-02-02 00:00:00.000' AS AbsenceStart, '2016-02-05 00:00:00.000' AS AbsenceEnd, 4 AS NoOfDays, 2 AS rnk 
UNION ALL 
SELECT 'John Doe' AS Name, 1536 AS InstanceID, '2016-02-19 00:00:00.000' AS AbsenceStart, '2016-02-22 00:00:00.000' AS AbsenceEnd, 2 AS NoOfDays, 3 AS rnk 
UNION ALL 
SELECT 'John Doe' AS Name, 1547 AS InstanceID, '2016-02-26 00:00:00.000' AS AbsenceStart, '2016-03-10 00:00:00.000' AS AbsenceEnd, 10 AS NoOfDays, 4 AS rnk 
UNION ALL 
SELECT 'John Doe' AS Name, 1660 AS InstanceID, '2016-04-04 00:00:00.000' AS AbsenceStart, '2016-04-04 00:00:00.000' AS AbsenceEnd, 0.5 AS NoOfDays, 5 AS rnk 
UNION ALL 
SELECT 'John Doe' AS Name, 1666 AS InstanceID, '2016-04-07 00:00:00.000' AS AbsenceStart, '2016-04-14 00:00:00.000' AS AbsenceEnd, 6 AS NoOfDays, 6 AS rnk 
UNION ALL 
SELECT 'John Doe' AS Name, 1698 AS InstanceID, '2016-04-27 00:00:00.000' AS AbsenceStart, '2016-04-28 00:00:00.000' AS AbsenceEnd, 1 AS NoOfDays, 7 AS rnk 

, die den unten Ausgang gibt.

enter image description here

Ich brauche eine Abfrage zu entwerfen, die Flagge, wenn es mehr als drei Instanzen innerhalb eines Zeitraums von 90 Tagen. Mit dem oben genannten Datum 1406,1493,1536,1547,1660,1666 würden alle (historisch) auf der Fahne stehen. Idealerweise wird die Abfrage täglich ausgeführt und die Warnung wird gesetzt, sobald eine dritte Instanz protokolliert wird. Ich habe verschiedene DATEDIFFs und abgeleitete Abfragen ausprobiert, aber es scheint nicht zu funktionieren. Also die gewünschte Ausgabe wäre die obige Tabelle, aber beschränkt auf diejenigen, die in den Datumsbereich der ersten Abwesenheit Start + 90 Tage fallen. Ich weiß, ich vermisse etwas Einfaches!

+1

welche Spalte sollte vergleichen, um zu überprüfen, ob es fällt in Abwesenheit Start + 90 Tage? Ist es "Abwesenheitsende"? –

Antwort

1

Sie können dies mit einer Schleife tun, siehe meinen Code unten (kommentiert). Ich gebe Ihre Anfangsdaten in #temp:

if object_id('tempdb..#temp') is not null 
drop table #temp 

SELECT 'John Doe' AS Name, 1406 AS InstanceID, '2016-01-08 00:00:00.000' AS 

AbsenceStart, '2016-01-13 00:00:00.000' AS AbsenceEnd, 4 AS NoOfDays, 1 AS rnk 
into #temp 
UNION ALL 
SELECT 'John Doe' AS Name, 1493 AS InstanceID, '2016-02-02 00:00:00.000' AS AbsenceStart, '2016-02-05 00:00:00.000' AS AbsenceEnd, 4 AS NoOfDays, 2 AS rnk 
UNION ALL 
SELECT 'John Doe' AS Name, 1536 AS InstanceID, '2016-02-19 00:00:00.000' AS AbsenceStart, '2016-02-22 00:00:00.000' AS AbsenceEnd, 2 AS NoOfDays, 3 AS rnk 
UNION ALL 
SELECT 'John Doe' AS Name, 1547 AS InstanceID, '2016-02-26 00:00:00.000' AS AbsenceStart, '2016-03-10 00:00:00.000' AS AbsenceEnd, 10 AS NoOfDays, 4 AS rnk 
UNION ALL 
SELECT 'John Doe' AS Name, 1660 AS InstanceID, '2016-04-04 00:00:00.000' AS AbsenceStart, '2016-04-04 00:00:00.000' AS AbsenceEnd, 0.5 AS NoOfDays, 5 AS rnk 
UNION ALL 
SELECT 'John Doe' AS Name, 1666 AS InstanceID, '2016-04-07 00:00:00.000' AS AbsenceStart, '2016-04-14 00:00:00.000' AS AbsenceEnd, 6 AS NoOfDays, 6 AS rnk 
UNION ALL 
SELECT 'John Doe' AS Name, 1698 AS InstanceID, '2016-04-27 00:00:00.000' AS AbsenceStart, '2016-04-28 00:00:00.000' AS AbsenceEnd, 1 AS NoOfDays, 7 AS rnk 


-- First find the start rank: 
declare @x int = (select top 1 rnk from #temp order by rnk asc) 
-- Find the maximum number of records to loop through 
declare @y int = (select top 1 rnk from #temp order by rnk desc) 
-- This is your threshold for publishing 
declare @a int 

-- start loop 
while @x <= @y 


begin 

if @a >=3 
break; -- if threshold breached, stop loop. 

else  

if object_id('tempdb..#list') is not null 
drop table #list 

declare @z datetime = (select AbsenceStart from #temp where rnk = @x) 
print @z 

select 
instanceid, 
AbsenceStart 
into #list 
from #temp 
where AbsenceStart >= @z 
and AbsenceStart <= dateadd(dd,90,@z) 


set @a = (select count(instanceid) from #list) 



set @x = @x + 1 

print @x 

end 

insert into dbo.DestinationTable 
select * 
from #list