如果仅在过去的X天之后选择重复

时间:2016-02-26 17:18:51

标签: sql-server

我需要一些帮助来构建一个查询,以便只撤回在一定天数之后的重复,在我的情况下为30。

我的表格结构如下:

PatientID  Date  
1          2015-09-01  
1          2015-09-03  
2          2015-03-04  
2          2015-03-07  
2          2015-09-15

在这个例子中,我只想返回第1,3和5行。

我尝试自己做左连接,其中第二个日期是> DATEADD(d,30,日期)。

我的另一个想法是递归CTE,第一个查询拉动每个患者的最小日期,然后是一个联合,其中表格日期比每个患者CTE日期的最大值至少30天但是你不能加入声明中的最大值。

我很难过。任何建议都将不胜感激。

2 个答案:

答案 0 :(得分:2)

我就是这样做的:

SELECT * FROM MyTable t1
WHERE NOT EXISTS(
 SELECT * FROM MyTable t2
 WHERE t1.PatientId=t2.PatientId
 AND t2.Date < t1.Date
 AND DATEDIFF(dd, t2.Date, t1.Date) < 30
)
ORDER BY t1.PatientId, t1.Date ASC

答案 1 :(得分:0)

我认为这样的事情应该有用(记事本编码在这里,所以语法可能有点偏离)

WITH CTE(
   SELECT PatientId, Min(Date) as Date
  FROM MyTable
  Group BY PatientId)
SELECT A.*
FROM MyTable A
LEFT OUTER JOIN CTE CTE
  ON A.PatientId = CTE.PatientId
  AND (A.Date = CTE.Date OR A.Date > DATEAdd(dd, 30, CTE.Date)
WHERE CTE.PatientId IS NOT NULL