0

在我们的系统中,我们有一种情况,住院患者可以返回医院进行计划外的再入院(这取决于他们再次入院的病房)。在数据中,我正在寻找与上次约会相关的在一定时间内返回的计划外再入院。

所以我可能有:

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。

我期望看到的似乎是代码应该给出的,但事实并非如此,我不明白为什么。在我缺少的逻辑中,这可能是显而易见的。

安德鲁

4

1 回答 1

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。

于 2013-09-25T10:09:56.863 回答