在我们的系统中,我们有一种情况,住院患者可以返回医院进行计划外的再入院(这取决于他们再次入院的病房)。在数据中,我正在寻找与上次约会相关的在一定时间内返回的计划外再入院。
所以我可能有:
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。
我期望看到的似乎是代码应该给出的,但事实并非如此,我不明白为什么。在我缺少的逻辑中,这可能是显而易见的。
安德鲁