postgresql - 将返回值合并到一行
问题描述
我正在尝试加入两张表格,一张包含患者信息,另一张包含手术时间。我需要提取患者 ID 和 4 个不同的时间,这些时间因每个患者而异。我可以使用下面的查询提取数据,但我遇到了一个问题,即我的结果包括同一患者的多个条目,结果分散在每个条目上。我相信这个问题与我的第二张桌子的设置方式有关,但我并不积极。我也没有办法改变这一点。
所有患者每次就诊都有一个唯一的 visit_id,因此不会有重复。
我认为 SELECT DISTINCT ON 或 GROUP BY 会帮助解决这个问题,但我无法让它们中的任何一个以我需要的方式工作。最终目标是在同一行的各自列中获取所有数据。
下面的示例数据:
例表 1(访问)
访问ID | 访问名称 |
---|---|
12345 | 吉姆 |
23456 | 担 |
Ex 表 2 (multi_app_documentation)
nsma1_patnum | nsma1_code | nsma1_ans |
---|---|---|
12345 | 奥林泰 | 0730 |
12345 | 奥特 | 1030 |
12345 | surgstart | 0735 |
12345 | 停止 | 1025 |
23456 | 奥林泰 | 0735 |
23456 | 奥特 | 1035 |
23456 | surgstart | 0740 |
23456 | 停止 | 1030 |
防爆结果
patinstitutionid | 或进入时间 | 退出时间 | 切口开始时间 | 皮肤闭合时间 |
---|---|---|---|---|
12345 | 07:30:00 | NR | NR | NR |
12345 | NR | 10:30:00 | NR | NR |
12345 | NR | NR | 07:35:00 | NR |
12345 | NR | NR | NR | 10:25:00 |
23456 | 07:35:00 | NR | NR | NR |
23456 | NR | 10:35:00 | NR | NR |
23456 | NR | NR | 07:40:00 | NR |
23456 | NR | NR | NR | 10:30:00 |
select
v.visit_id as PatInstitutionID,
case --Add colons and seconds to time format
when mAD.nsma1_code = 'ORINTIME'
then concat(
substring(mAD.nsma1_ans,1,2), ':',
substring(mAD.nsma1_ans,3,2), ':',
'00')
else 'NR'
end as OREntryTime,
case --Add colons and seconds to time format
when mAD.nsma1_code = 'OROUT'
then concat(
substring(mAD.nsma1_ans,1,2), ':',
substring(mAD.nsma1_ans,3,2), ':',
'00')
else 'NR'
end as ORExitTime,
case --Add colons and seconds to time format
when mAD.nsma1_code = 'surgstart'
then concat(
substring(mAD.nsma1_ans,1,2), ':',
substring(mAD.nsma1_ans,3,2), ':',
'00')
else 'NR'
end as IncisionStartTime,
case --Add colons and seconds to time format
when mAD.nsma1_code = 'surgstop'
then concat(
substring(mAD.nsma1_ans,1,2), ':',
substring(mAD.nsma1_ans,3,2), ':',
'00')
else 'NR'
end as SkinClosureTime
from visit as v
inner join multi_app_documentation as mAD
on v.visit_id = nsma1_patnum and nsma1_arid = 5
where v.visit_arid = 5
and v.visit_admit_date > current_date - interval '60' day --Determines dates to pull using admit date
order by v.visit_id
解决方案
你实际上很接近。您需要的是基本上提取您拥有的内容并将其作为子查询。然后外部查询为生成的每一列获取 MAX。唯一显着的区别是设置“NR”值,它被延迟到外部查询。在大多数情况下,它可能没有必要,但生成的查询留下了缺少代码值的可能性。此外,以下不使用visit_arid也不使用visit_admit_date列。这些列不在您的示例数据中。(可能是由于“混乱”的示例表。
见 fiddle here)。
select PatInstitutionID
, coalesce( max(OREntryTime) , 'NR' ) OREntryTime
, coalesce( max(ORExitTime) , 'NR' ) ORExitTime
, coalesce( max(IncisionStartTime) , 'NR' ) IncisionStartTime
, coalesce( max(SkinClosureTime) , 'NR' ) SkinClosureTime
from ( select v.visit_id as PatInstitutionID
, case --Add colons and seconds to time format
when mAD.nsma1_code = 'ORINTIME'
then concat(
substring(mAD.nsma1_ans,1,2), ':',
substring(mAD.nsma1_ans,3,2), ':',
'00')
end as OREntryTime
, case --Add colons and seconds to time format
when mAD.nsma1_code = 'OROUT'
then concat(
substring(mAD.nsma1_ans,1,2), ':',
substring(mAD.nsma1_ans,3,2), ':',
'00')
end as ORExitTime,
case --Add colons and seconds to time format
when mAD.nsma1_code = 'surgstart'
then concat(
substring(mAD.nsma1_ans,1,2), ':',
substring(mAD.nsma1_ans,3,2), ':',
'00')
end as IncisionStartTime
, case --Add colons and seconds to time format
when mAD.nsma1_code = 'surgstop'
then concat(
substring(mAD.nsma1_ans,1,2), ':',
substring(mAD.nsma1_ans,3,2), ':',
'00')
end as SkinClosureTime
from visit as v
inner join multi_app_documentation as mAD
on v.visit_id = nsma1_patnum
) i
group by PatInstitutionID
order by PatInstitutionID;
注意:小心使用 CamelCase 名称。除非您将它们双引号 ("),否则 Postgres 将折叠为小写,因此您会得到驼峰式。
推荐阅读
- logging - NLog 将归档内容写入当前日志文件
- angular - 随机发送无正文的 POST 请求
- html - 基于属性选择器动态创建组件
- python - 立即服务 URL 认证
- javascript - 如何使用 ckeditor 4 类型(链接、图像、flash)打开不同的对话框
- django - 在 VSCode 调试器中设置 GOOGLE_APPLICATION_CREDENTIALS 环境变量
- jenkins - Tox 的缓存有多可靠?
- batch-file - 批处理文件移动不适用于某些特殊字符
- nginx - 具有 Kubernetes Ingress 资源 (nginx) 的不同路径上的两个 Flask 应用程序
- sql - Excel VBA 中 SQL 更新函数的正确语法