处理缺失值,同时使用 postgresql 将每组的滞后值相乘

Handle missing values while multiply the lagged values of each group using postgresql

我的数据如下所示

id  person_id Measurement   Value   UNIT
1     A1         Height      1.75      m
2     A1         Weight       64     kg
3     A2         Weight       71     kg
4     A2         Height      1.81     m 
5     A3         Height      1.89     m
6     A4         Weight      75      kg
7     A4         Height      1.76     m

我想使用公式 BMI = (Weight) / (height * height)

计算每个受试者的 BMI

我尝试通过以下方法获取一行中的值,以便我可以应用公式,但遇到了错误

SELECT *
    LAG(value) OVER(PARTITION BY person_id ORDER BY id) val_prev1,
    LAG(value, 2) OVER(PARTITION BY person_id ORDER BY id) val_prev2
  FROM 
(select * from table1)A

在上面的代码中,我不确定如何考虑丢失的记录。 例如,person_id = A3 没有体重测量,我们需要输入 NA,BMI 也保留为 NA

我希望我的输出如下所示

Person_id  Measurement Value unit
   A1       BMI         20.8
   A2       BMI         XXX    #Multiplied value goes here
   A3       BMI         XXX  
   A4       BMI         XXX

使用条件聚合:

select person_id,
       (power(max(value) filter (where measurement = 'weight'), 2) /
        max(value) filter (where measurement = 'height')
       ) as bmi
from t
group by person_id;

您也可以使用中缀运算符^来计算平方。

在你的例子中,身高和体重的单位都是一致的。如果您的实际数据不是这种情况,请提出一个 new 问题,并解释如何将值转换为适当的单位。