SQL 条件求和和分组

Posted

技术标签:

【中文标题】SQL 条件求和和分组【英文标题】:SQL Conditional sum and grouping 【发布时间】:2015-06-04 06:56:25 【问题描述】:

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

| 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的列(仅在患者被统计分离和入院时使用)


根据定义,每位患者的住院时间都是从入院开始计算到他们分离(统计分离和入院随着入院而进行,但他们被赋予了一个新的入院 ID强>

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

我需要总结患者的 Durations 以获得他们入院的总住院时间(这是 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

【问题讨论】:

【参考方案1】:

这个怎么样:

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

【讨论】:

这可能行得通,但如果该患者在报告期内(例如一年或两年)多次(正式)入院并分开怎么办 好吧,因为我们是按 admissionid 分组的,所以这些将作为单独的行返回,如果您希望每个患者的总数,您可以按患者分组。 这仍然会返回单独的行,因为准入 ID 具有不同的值。我已经编辑了我的问题,以包含一个我认为可能会有所帮助的专栏。将统计准入与统计分离联系起来。 我不明白。您想要所有患者的平均住院时间,对吗?所以如果我去过两次医院,第一次10天,第二次20天,你去过一次医院30天,答案是20? 现实世界的情况要复杂一些,查询将获得跨越多个不同领域的 ALOS(ALOS 在特定病房、医院、校园内花费)。所以我需要单独找到每个患者入院(正式开始到结束)的住院时间。一旦我获得了准入的总持续时间,我将能够报告所有领域的正确 ALOS。我花了几个月的时间来理解这些数据,所以我明白为什么它看起来令人困惑

以上是关于SQL 条件求和和分组的主要内容,如果未能解决你的问题,请参考以下文章

sql 分组 求累计值

根据不同的条件对两个不同的列进行分组和求和

oracle求和问题,不要分组条件,只要求和

Mysql按照某个条件进行分组求和并且要知道参与求和的各项明细

SQL连接和条件求和

sql多条件分组查询,求sql语句。