首页 > 解决方案 > 将返回值合并到一行

问题描述

我正在尝试加入两张表格,一张包含患者信息,另一张包含手术时间。我需要提取患者 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

标签: postgresql

解决方案


你实际上很接近。您需要的是基本上提取您拥有的内容并将其作为子查询。然后外部查询为生成的每一列获取 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 将折叠为小写,因此您会得到驼峰式。


推荐阅读