2016-05-19 2 views
1

Мне нужно создать SQL-запрос, который заполняет таблицу, если кто-то был в 3 раза и более за 3 месяца.3 Strikes Query SQL 2008

Данные у меня доступны для меня:

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 

Который дает ниже вывод.

enter image description here

Мне нужно разработать запрос, который будет флаг, когда есть более 3 экземпляров в течение периода 90 дней. Таким образом, с вышеуказанной датой 1406,1493,1536,1547,1660,1666 все будут отмечены (исторически). В идеале запрос будет запускаться ежедневно и устанавливать предупреждение сразу после регистрации третьего экземпляра. Я пробовал различные DATEDIFF и полученные запросы, но не могу заставить его работать. Таким образом, желаемый результат будет приведен выше, но ограничен теми, которые попадают в диапазон дат начала первого отсутствия + 90 дней. Я знаю, что мне не хватает чего-то простого!

+1

какой столбец следует сравнивать, чтобы проверить, не попадает ли он в «отсутствие начала + 90 дней»? Это 'AbsenceEnd'? –

ответ

1

Вы можете сделать это с помощью цикла, см. Мой код ниже (прокомментировано). Я помещаю ваши исходные данные в #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