使用2个游标查找返回约会

时间:2013-09-25 09:57:11

标签: sql-server cursor

在我们的系统中,我们的情况是医院病人可以回到医院进行计划外再入院(这取决于他们被重新入院的病房)。在数据中,我正在寻找在上一次约会的某个时间内回来的计划外再入院。

所以我可能会:

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。

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

安德鲁

1 个答案:

答案 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。