Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
处理缺少的值,同时使用postgresql将每个组的滞后值相乘_Sql_Postgresql_Group By_Sql Order By_Lag - Fatal编程技术网

处理缺少的值,同时使用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