在我们的系统中,我们的情况是医院病人可以回到医院进行计划外再入院(这取决于他们被重新入院的病房)。在数据中,我正在寻找在上一次约会的某个时间内回来的计划外再入院。
所以我可能会:
John Smith承认:2013年9月20日,2013年9月22日卸下
然后在下面的另一条记录中进行计划外招生(由特殊病房确定):
John Smith承认:2013年9月25日,2013年9月28日卸下
所以我需要做的是检查第一记录中的出院数据和第二记录中的入院日期之间的数据差异,如果天数差异小于或等于7天且该人员去了计划外的入院病房,那么我显示此数据。
我将所有数据引入SQL Server,其想法是创建一个游标以逐步浏览所有记录,并使用嵌套游标逐步浏览与未计划的许可相关的所有记录。
我在嵌套和主光标中区分数据的方式是他们被录取的病房,他们的入院ID(唯一)与主光标记录中的不同,但患者ID是匹配的。
这意味着我不会比较相同的录取记录,但会查看同一患者的其他录取记录,并检查是否在7天内。
我使用的代码如下,我遇到的主要问题是在游标中使用了datediff函数。
DECLARE C_Admmissions CURSOR FOR
SELECT PatientID, [admission date], [discharge date], admissionid, [ward code]
FROM Admissions
open C_Admmissions
FETCH NEXT
FROM C_Admmissions into @PatientID, @admissiondate, @dischargedate, @admissionid, @wardcode
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE C_unscheduled_Admmissions CURSOR FOR
SELECT PatientID, [admission date], [discharge date], admissionid, [ward code]
FROM Admissions
WHERE [ward code] = 'unsch_adm'
AND admissionid != @admissionid
AND [PatientID] = @PatientID
open C_unscheduled_Admmissions
FETCH NEXT FROM C_unscheduled_Admmissions into @PatientID2, @admissiondate2, @dischargedate2, @admissionid2, @wardcode2
WHILE @@FETCH_STATUS = 0
BEGIN
begin
if DATEDIFF(DD, @dischargedate, @admissiondate2)<=7
begin
insert into unscheduled_admissions values(@PatientID, @admissiondate, @dischargedate, @admissionid, @wardcode)
end
begin
insert into unscheduled_admissions values(@PatientID2, @admissiondate2, @dischargedate2, @admissionid2, @wardcode2)
end
end
FETCH NEXT
FROM C_unscheduled_Admmissions into @PatientID2, @admissiondate2, @dischargedate2, @admissionid2, @wardcode2
END
CLOSE C_unscheduled_Admmissions
DEALLOCATE C_unscheduled_Admmissions
FETCH NEXT
FROM C_Admmissions into @CHI, @admissiondate, @dischargedate, @admissionid, @wardcode
END
CLOSE C_Admmissions
DEALLOCATE C_Admmissions
END
GO
我正在将录取和重新接入的值插入到表格中以查看我获得的数据,而不是获得录取,然后在不到7天后(从上一个放电日期开始)下一行显示重新接收它只是显示所有入院和再入院,同一行数据的入院和出院时间不到7天。
处理不在实时系统上,我使用的总数据行大约是170,000。
我期待看到的似乎是代码应该给出的但是它不是,我不明白为什么。在我缺少的逻辑中,这可能是显而易见的。
安德鲁
答案 0 :(得分:2)
听起来你甚至不需要一个光标。像这样的东西应该产生你需要的数据(尽管可能不是你想要的格式):
SELECT *
FROM
Admissions first
INNER JOIN
Admissions readmit
ON
first.PatientID = readmit.PatientID AND
first.AdmissionID < readmit.AdmissionID AND
DATEDIFF(day,first.[discharge date],readmit.[admission date]) <= 7
WHERE
readmit.[ward code] = 'unsch_adm'
(没有您的数据,这是未经测试的)。
您的原始代码可能是错误的,因为您根本不会在原始录取之后检查重新开始。在上文中,我假设first.AdmissionID < readmit.AdmissionID
将涵盖该内容(而不是!=
支票) - 该行的另一种选择是first.[discharge date] < readmit.[admission date]
。
DATEDIFF(day,<recent date>,<date in the far past>)
将产生负值 - 小于7。