首页 > 解决方案 > SQL - 如何跨行旋转和组合数据

问题描述

我很想在一个包含个人生命体征的健康应用程序的数据集上建模,想象一下 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)中实现上述目标?

谢谢

标签: sqlsql-serverpostgresqlpivot

解决方案


使用 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 值,我将直接返回内部查询的结果,而不是将其转换为单独的列。


推荐阅读