我尝试在一个包含个人生命体征的数据集上为一个健康应用程序建模,想象一下Fitbit。但是,对于给定的人,这些生命体征是作为单独的行记录和报告的。例如。
TableName: PersonalVitals
PersonID | RecordedTime | VitalType | VitalValue
1 | 17:10 | HR | 72bpm <- Heart rate
1 | 17:10 | RR | 19insp/min <- Respiratory rate
2 | 15:35 | RR | 11insp/min <- Respiratory rate
1 | 17:15 | HR | 76bpm <- Heart rate现在,在提取时,我需要对此数据进行透视,以便将在同一时间内获取的所有生命体征一起报告,如下所示
PersonID | RecordedTime | HR | RR | SpO2 | BP(Blood Pressure)
1 | 17:10 | 72bpm | 19insp/min | null | null
1 | 17:15 | 76bpm | null | null | null
2 | 15:35 | null | 11insp/min | null | null 如何在SQL (sql-server或postgres)中实现上述功能?
谢谢
发布于 2019-08-02 20:51:38
使用Postgres时,我会将所有关键字聚合到一个JSONB值中,然后将它们提取为列:
select person_id,
recorded_time,
vitals ->> 'HR' as "HR",
vitals ->> 'RR' as "RR",
vitals ->> 'SpO2' as "SpO2",
vitals ->> 'BP' as "Blood Pressure"
from (
select person_id, recorded_time,
jsonb_object_agg(vital_type, vital_value) as vitals
from person_vitals
group by person_id, recorded_time
) t
order by person_id, recorded_time;在线示例:https://rextester.com/ONNU50709
与所有透视解决方案一样,如果添加新的重要类型,则需要更改查询。有了上面的解决方案,就足以在外部查询中做到这一点。内部查询不需要更改。
如果处理该结果的代码可以处理JSON值,我将直接返回内部查询的结果,而不是将其转换为单独的列。
发布于 2019-08-02 20:29:21
使用Pivot
SELECT PersonID , RecordedTime,[HR],[RR] ,SpO2,[BP(Blood Pressure)]
FROM
(
SELECT * ,NULL AS SpO2,NULL AS [BP(Blood Pressure)]
FROM #PersonalVitals
)
As Src
PIVOT
(
MAX(VitalValue) FOR VitalType IN ([HR],[RR]))AS Pvt
ORDER BY PersonIDhttps://stackoverflow.com/questions/57326430
复制相似问题