SQL 条件求和与分组

SQL Conditional sum and grouping

我有一个查询试图总结患者在医院的住院时间。这是数据的示例

| Patient | Admission_ID | Admission_Event_ID | Admission_Event_Type  | Start Date | End Date   | Duration | Linked_Admission |
| P0001   | ADM0001      | AE1                | (formal) Separation   | 2012-12-18 | 2012-12-18 | 0        | ADM0002          |
| P0001   | ADM0001      | AE2                | Statistical Admission | 2012-12-17 | 2012-12-18 | 1        | ADM0002          |
| P0001   | ADM0002      | AE3                | Statistical Separation| 2012-12-17 | 2012-12-17 | 0        | NULL             |
| P0001   | ADM0002      | AE4                | (formal) Admission    | 2012-11-30 | 2012-12-17 | 17       | NULL             |
| P0002   | ADM0003      | AE5                | (formal) Admission    | 2012-11-30 | 2012-12-25 | 25       | NULL             |
. . . 

编辑:忘了说了,有一栏链接入院ID(只在患者统计分开入院时使用)


根据定义,住院时间是从每位患者入院开始计算到他们分离(统计分离和入院与入院一起进行,但他们得到了一个新的 录取编号

一个报告是 运行 找出医院及其单位的平均住院时间 (ALOS),用户选择两个日期之间的报告。我使用了 CTE(我们称之为 CTESep)来获取所有在报告期间正式分居 的患者。然后我使用另一个 CTE(称为 CTEAdmissions)来获取 CTESep 中所有患者的入院信息。这就是我卡住的地方。

我需要总结患者的持续时间以获得他们入院的总住院时间(这是 ADM0001 和 ADM0002 的组合),因此总 LOS 将为 18,而不是 17 和 1。 我的想法是

    ORDER BY Patient
    , End_Date DESC
    , adm_id
    , CASE WHEN 
            Admission_Event_Type  = '(formal) Separation   ' THEN 1
           WHEN Admission_Event_Type  = 'Statistical Admission ' THEN 2
           WHEN Admission_Event_Type  = 'Statistical Separation' THEN 3
           WHEN Admission_Event_Type  = '(formal) Admission    ' THEN 4 
      END ASC

然后根据条件总结持续时间。条件规则是‘开始总结每位患者入院从正式分离到正式入院的时长’。我不知道该怎么做。 我试过:

SELECT SUM(Duration) OVER(PARTITION BY Patient) AS 'Sum'

但这会给我所有入院患者的总 LOS(如果他们在该报告期内有不止一次分离) 我也试过

 SELECT SUM(Duration) OVER(PARTITION BY Patient, Admission_ID) AS 'Sum'

当然,这给了我正式入院和统计分离之间患者的 LOS(而不是实际定义的 LOS)。

有人有解决这个问题的不同方法吗?顺便说一下,使用 Sybase

这个怎么样:

select patientid,
       admissionid,
       datediff(day, 
                  max(case when Admission_Event_Type = '(formal) Separation   ' then startdate end),
                  max(case when Admission_Event_Type = '(formal) Admission    ' then enddate end)
               ) as total_length
from data
group by patientid, admissionid