【问题标题】:Using 2 Cursors to Find Return Appointments使用 2 个光标查找返回约会
【发布时间】:2013-09-25 09:57:10
【问题描述】:

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

所以我可能有:

约翰·史密斯入院时间:2013 年 9 月 20 日,2013 年 9 月 22 日出院

然后在下面的非计划入院(由特殊病房识别)的另一个记录:

约翰·史密斯入院时间: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。

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

安德鲁

【问题讨论】:

    标签: sql-server cursor


    【解决方案1】:

    听起来你甚至不需要一个光标。这样的东西应该会产生您需要的数据(尽管可能不是您想要的格式):

    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 &lt; readmit.AdmissionID 将涵盖这一点(而不是您的 != 检查) - 替代方案将是 first.[discharge date] &lt; readmit.[admission date] 在该行。

    DATEDIFF(day,<recent date>,<date in the far past>)
    

    将产生一个负值 - 小于 7。

    【讨论】:

    • 感谢您的建议,我正在处理查询,但无法使其正常工作。 AdmissionID 是字母数字的,因此需要不等于另一个 ID 作为标准之一。我还意识到 datediff 的负数问题,并交换了重新入院日期和首次出院日期的字段,并添加了另一个条件,但仍然得到错误的结果
    • 打印的日期显示是这样的 'Sep 20 2013 12:00AM' 并且在查询结果集中是这样的:'2013-09-20 00:00:00.000' - 这个螺丝更新日期差异检查?
    • @Andrew - 希望在数据库中,它们被存储为datetime 值(没有具有任何格式)。如果它们是字符串,则可能需要做更多的工作。
    • 我认为我确实需要使用光标以外的东西,因为它需要很长时间才能处理。
    • @Andrew - 我展示的一般查询应该可以工作 - 正如我所说,没有你的数据,我无法测试它。但要点是,这是一个表自身的自连接。连接条件是(第 1 行)它们是同一患者的行,(第 2 行)别名为 first 的行来自比别名为 readmit 的行更早的时间,以及(第 3 行)间隙它们之间小于或等于 7 天。我希望您能够对此进行调整,使其与您的数据真正匹配。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多