希望有人可以提供帮助。我有一张看起来像下面的桌子
CaseID ClientID ContactDate
23722 8283 01-JAN-2018
2322 233 04-FEB-2018
23382 833 06-FEB-2018
2324 8283 08-FEB-2018
我想要做的是创建一个存储过程,该存储过程包含一个名为@DT
的参数(这将是指定的日期)。一旦运行,存储过程将为我提供ClientID
参数前30天之前没有ContactDate
的所有@DT
的列表。这将称为contactflag
。我还希望它再次检查表,以查看客户端在ContactDate
参数之后的7天内是否有@DT
,这将称为HadNextContact
标志。基于为@DT
分配了7 Feb 2018
的日期,理想的输出看起来像这样;
ClientID ContactFlag HadNextContact
8283 1 1
233 0 0
833 0 0
{{1}的ContactFlag
设置为1
,因为在ClientID = 8283
之前的30天内他们没有ContactDate
。 7 Feb 2018
标志也被设置为HadNextContact
之后7天内的ContactDate
。
希望有人可以提供帮助?一如既往地感激!
杰西
答案 0 :(得分:2)
您可以尝试将条件汇总函数与DATEDIFF
函数一起使用。
SELECT ClientID,
MAX(CASE WHEN DATEDIFF(DAY,ContactDate,@DT) > 30 THEN 1 ELSE 0 END) ContactFlag,
MAX(CASE WHEN ContactDate BETWEEN @DT AND DATEADD(DAY,7,@DT) THEN 1 ELSE 0 END) HadNextContact
FROM T
GROUP BY ClientID
答案 1 :(得分:1)
尝试一下:
declare @dt datetime='20180207'
select
c.ClientID,
case
when exists
(
select 1
from ClientCaseHistory tb -- TableBefore
where tb.ClientID=c.ClientID and tb.ContactDate between dateadd(day,-30,@dt) and @dt
)
then 0 else 1 end as ContactFlag,
case
when exists
(
select 1
from ClientCaseHistory ta -- TableAfter
where ta.ClientID=c.ClientID and ta.ContactDate between @dt and dateadd(day,7,@dt)
)
then 1 else 0 end as HadNextContact
from
--Get all ClientIDs. Maybe you have a better table to do this, a client table?
(
select distinct ClientID
from ClientCaseHistory t
)c