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 条件求和和分组的主要内容,如果未能解决你的问题,请参考以下文章