为特定时间段创建平均值

时间:2018-12-12 12:36:45

标签: sql database postgresql

我正在设置每行= 1小时的时间序列。 输入数据有时每小时具有多个值。这可能会有所不同。

现在特定的代码如下:

select
patientunitstayid
, generate_series(ceil(min(nursingchartoffset)/60.0), 
ceil(max(nursingchartoffset)/60.0)) as hr
, avg(case when nibp_systolic >= 1 and nibp_systolic <= 250 then 
nibp_systolic else null end) as nibp_systolic_avg
from nc            
group by patientunitstayid
order by patientunitstayid asc;

并生成以下数据:

enter image description here

它采用每个患者的整个时间序列的平均值,而不是每个小时的平均值。我该如何解决?

1 个答案:

答案 0 :(得分:1)

我期望这样的事情:

select nc.patientunitstayid, gs.hr, 
       avg(case when nc.nibp_systolic >= 1 and nc.nibp_systolic <= 250 
                then nibp_systolic 
           end) as nibp_systolic_avg
from (select nc.*,
             min(nursingchartoffset) over (partition by patientunitstayid) as min_nursingchartoffset,
             max(nursingchartoffset) over (partition by patientunitstayid) as max_nursingchartoffset
      from nc
     ) nc cross join lateral
     generate_series(ceil(min_nursingchartoffset/60.0), 
                     ceil(max_nursingchartoffset/60.0)
                    ) as gs(hr)
group by nc.patientunitstayid, hr
order by nc.patientunitstayid asc, hr asc;

也就是说,您需要按hr进行汇总。我将其放在from子句中,以突出显示这会生成。如果使用的是Postgres的旧版本,则可能没有横向连接。如果是这样,只需在from子句中使用子查询即可。

编辑:

您也可以尝试:

from (select nc.*,
             generate_series(ceil(min(nursingchartoffset) over (partition by patientunitstayid) / 60.0), 
                             ceil(max(nursingchartoffset) over (partition by patientunitstayid)/ 60.0)
                            ) hr
      from nc
     ) nc

并在外部查询中调整对hr的引用。