我试图找出患者在同一天内没有发生任何约会的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
答案 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
但是,执行计划是相同的(可能与这些小数据无关)。