sql - 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)中实现上述目标?
谢谢
解决方案
使用 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 值,我将直接返回内部查询的结果,而不是将其转换为单独的列。
推荐阅读
- go - Golang Proto 中的 Marshal 和 unmarshal 是什么?
- flutter - 使用带有 bloc 的底部导航器表仅显示一次
- swiftui - iOS 15 上一个列表中的多个 Wheel Picker 的 SwiftUI 问题
- github - 将 README.md 重命名为自定义名称并用作项目描述
- azure - 无法使用 Nlog 将日志写入 Azure
- spring-boot - 加载资源失败 405
- java - URL 连接 Android 8.0.0
- matlab - 如何将用于图像有限差分导数逼近的 MATLAB 代码转换为一维信号?
- java - 即使 Junit 是绿色的,Wiremock 也显示零代码覆盖率
- powershell - 在Powershell中重新排列IF语句时的输出切换