2016-02-26 73 views
1

我需要一些帮助的结构化查询,只拉回来是在设定的天数后复发,在我的案件30选择复发只有当至少在X天过去上一页

我的表结构如下: :

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天,但是您不能连接语句中的最大值。

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

+0

的SQL版本服务器你在用吗?你可以使用'LAG' – ughai

回答

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 
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 
相关问题