处理缺少的值,同时使用postgresql将每个组的滞后值相乘
我的数据如下所示处理缺少的值,同时使用postgresql将每个组的滞后值相乘,sql,postgresql,group-by,sql-order-by,lag,Sql,Postgresql,Group By,Sql Order By,Lag,我的数据如下所示 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
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
Person_id Measurement Value unit
A1 BMI 20.8
A2 BMI XXX #Multiplied value goes here
A3 BMI XXX
A4 BMI XXX
我想用公式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
在上面的代码中,我不确定如何考虑丢失的记录对于ex,person_id=A3没有体重测量,我们需要输入NA,并将BMI作为NA保留
我希望我的输出如下所示
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
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;
您还可以使用中缀运算符^
计算平方
在您的示例中,高度和重量的单位都是一致的。如果实际数据并非如此,请提出一个新问题,解释如何将值转换为适当的单位。谢谢。向上投票。因此,我们可以使用
^
操作符,而不是power
。对我认为这两者在Postgres中是完全相同的——但它们做的事情是相同的。我还可以知道,当一个或两个测量值(身高或体重)缺失时,代码的哪一部分会导致将NULL
置为空或将置为空。如果给定人员没有“身高”或“体重”,则过滤器将过滤掉所有行。然后max()
将返回NULL
。