处理缺失值,同时使用 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 问题,并解释如何将值转换为适当的单位。
我的数据如下所示
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)
我尝试通过以下方法获取一行中的值,以便我可以应用公式,但遇到了错误
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 问题,并解释如何将值转换为适当的单位。