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
我有一个查询试图总结患者在医院的住院时间。这是数据的示例
| 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