对患者进行分组并显示重复访问

时间:2012-04-25 16:47:26

标签: sql sql-server stored-procedures user-defined-functions

我有一个名为Visits的表格:

ID(PKey,Int)
PatiendID(int),
DoctorID(int),
ExpectedDate(date),
ActualDate(date),

如何编写一个查询,为每位患者返回重复访问次数。

如果访问时间少于上一次访问的一半,则视为重复访问。

换句话说,我需要为每位患者找到(上次访问 -6个月)和上次访问(不包括上次访问)之间的访问次数。是否可以编写没有游标的查询?

等问题。我有表患者 ID(int, PKey),Name,Pasport,State 这里的每个客户都可以找到相同的信息吗?或者更好地结合下面的查询和不在访问表中的所有客户端?

1 个答案:

答案 0 :(得分:2)

  

换句话说,我需要为每位患者找到之间的访问次数   (上次访问 - 6个月)和上次访问,不包括上次访问。

WITH CTE AS
(
    SELECT PatientID, MAX(ActualDate) AS LastVisit
    FROM Visits
    GROUP BY PatientID
)
SELECT CTE.PatientID, COUNT(1)-1 AS RepeatVisits
FROM CTE INNER JOIN Visits ON CTE.PatientID = Visits.PatientID
WHERE ActualDate BETWEEN DATEADD(month, -6, LastVisit) AND LastVisit
GROUP BY CTE.PatientId

这将按患者分组在上次访问前六个月内的所有访问。它会给你COUNT(总数)减1(不包括上次访问)。

完整示例:http://pastebin.com/vpCdASpB

对于第二部分(患者表),请参见此处:http://pastebin.com/nKw0Wqvp

WITH CTE AS
(
    SELECT Patients.PatientID, Patients.Name, MAX(ActualDate) AS LastVisit
    FROM Patients LEFT JOIN Visits ON #patient.PatientID = Visits.PatientID
    GROUP BY Patients.PatientID, Patients.Name
)
SELECT CTE.PatientID, CTE.Name, COUNT(1)-1 AS RepeatVisits
FROM CTE LEFT JOIN Visits ON CTE.PatientID = Visits.PatientID
                          AND Visits.ActualDate BETWEEN DATEADD(month, -6, LastVisit) AND LastVisit
GROUP BY CTE.PatientId, CTE.Name
ORDER BY PatientID;