在120天滚动窗口内查找患者有5个或更多任何约会的内容

时间:2015-12-16 20:18:40

标签: sql-server

我试图找出患者在同一天内没有发生任何约会的5个或更多,并且在120天(4个月)内。 在下面的示例中,唯一符合条件的患者是102,其中至少有五个约会在四个月内。框架是一个滚动框架,因此符合条件的期间可以包括一整年数据的向前或向后重叠日期。

我一直在尝试创建查询并找到解决方案,但我无法弄明白。我可以前进或后退,但我无法弄清楚如何获得覆盖移动窗口的查询。所有五个治疗预约必须存在于120个期间窗口内,以使患者被认为合格。

我简化了一个名为Appointments的表:

AppointmenDate  PatientID 
2015-01-01      101
2015-01-02      101
2015-01-03      101
2015-03-07      101
2015-03-04      101             
2015-03-04      102 *
2015-05-04      102 *
2015-06-04      102 *
2015-07-04      102 *
2015-07-05      102 *
2015-11-04      102
2015-11-04      102
2015-12-12      103

结果看起来大致如此(合格患者名单):

PatientID Qualified
102         yes

我的最大努力如下:

SELECT Distinct a.PatientID
    ,Qualified = 'yes'
FROM Appointments a
JOIN Appointments b ON a.PatientID = b.PatientID
    AND (b.AppointmenDate < DATEADD(day, 120, a.AppointmenDate)
    OR b.AppointmenDate > DATEADD(day, 120, a.AppointmenDate))
WHERE a.AppointmenDate > '2014-12-01' 
GROUP BY a.PatientID
    ,a.AppointmenDate
HAVING COUNT(*) >= 5
    order by PatientID

1 个答案:

答案 0 :(得分:0)

我不知道它是否是获取数据的最有效方式,但它应该获取您想要的内容:

WITH Per AS (
    SELECT A.PatientID, MIN(A.AppointmenDate) MinDate, MAX(A.AppointmenDate) MaxDate, COUNT(DISTINCT A.AppointmenDate) Cnt
    FROM Appointments A
    GROUP BY A.PatientID
)
SELECT Per.PatientID
FROM Per
WHERE DATEDIFF(day, Per.MinDate, Per.MaxDate) <= 120 
    AND Cnt >= 5

[编辑] 它看起来可以在一个更简单的查询中完成,但我必须重复聚合函数(我不喜欢):

SELECT A.PatientID, MIN(A.AppointmenDate) MinDate, MAX(A.AppointmenDate) MaxDate, COUNT(DISTINCT A.AppointmenDate) Cnt
FROM Appointments A
GROUP BY A.PatientID
HAVING DATEDIFF(day, MIN(A.AppointmenDate), MAX(A.AppointmenDate)) <= 120 
    AND COUNT(DISTINCT A.AppointmenDate) >= 5

但是,执行计划是相同的(可能与这些小数据无关)。