我有一个名为Visits
的表格:
ID(PKey,Int)
PatiendID(int),
DoctorID(int),
ExpectedDate(date),
ActualDate(date),
如何编写一个查询,为每位患者返回重复访问次数。
如果访问时间少于上一次访问的一半,则视为重复访问。
换句话说,我需要为每位患者找到(上次访问 -6个月)和上次访问(不包括上次访问)之间的访问次数。是否可以编写没有游标的查询?
等问题。我有表患者
ID(int, PKey),Name,Pasport,State
这里的每个客户都可以找到相同的信息吗?或者更好地结合下面的查询和不在访问表中的所有客户端?
答案 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;