2015-12-16 25 views
-1

我正在嘗試查找哪些患者有5個或更多的預約不在同一天發生,並且在120天內(4個月)期間。 在下面的示例中,符合條件的唯一患者是在四個月內至少有五次約會的患者爲10​​2。該框架是一個滾動框架,所以資格期可以包括向前或向後重疊一整年的數據。查找120天內滾動窗口內有5個或更多預約的患者

我一直在嘗試幾天來創建一個查詢,並找到一個解決方案,但我無法弄清楚。我可以前進或後退,但我無法弄清楚如何獲得涵蓋移動窗口的查詢。所有五項治療預約必須在120週期內存在,以使患者被認爲合格。

我簡單的表稱爲約會:

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

Google,瞭解SQL中的GETDATE()函數以及DATEADD()或DATEDIFF()函數。在WHERE子句中使用它們來創建移動窗口。 –

+0

你嘗試了什麼?請顯示你的努力 – baao

+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 

但是,執行計劃是相同的(可能與這些小數據無關)。

+0

它的工作原理!謝謝阿列克謝! –