>我有三列数据。一列有 ID,第二列有日期,第三列有 BMI 值。我想创建一个第四列,该列的first_value基于第三列的日期(升序(,该列不为空或避免为空。
到目前为止,我已经尝试了first_value简单的形式,但没有奏效。我尝试first_value在语句为
CASE
WHEN BMI IS NOT NULL THEN (FIRST_VALUE(BMI) OVER PARTITION BY PID ORDER BY DATE))
ELSE 0
END AS FIRSTNOTNULLVALUE_BMI
给了我0s。
id date BMI
1 2000-01-01 NULL
1 2003-05-01 18.1
1 2002-07-15 25.8
2 2009-09-25 NULL
2 2015-04-18 23.5
有什么建议吗??
您可以将该CASE
放在FIRST_VALUE
的ORDER BY
中。
然后,该函数的 null 将排在最后。
create table test ( pid int, pdate date, BMI decimal(4,1) ) insert into test (pid, pdate, BMI) values (1, '2000-01-01', NULL) , (1, '2003-05-01', 18.5) , (1, '2002-07-15', 24.9) , (2, '2009-09-25', NULL) , (2, '2015-04-18', 21.7) ;
select * , first_value(BMI) over (partition by pid order by case when BMI is not null then 1 else 2 end, date(pdate)) as firstBMI from test order by pid, pdate
PID | pdate |体重指数 |第一体重指数 :-- |:--------- |:--- |:------- 1 |2000年01月01日 |空|24.9 1 |2002年07月15日 |24.9 |24.9 1 |2003年05月01日 |18.5 |24.9 2 |2009年09月25日 |空|21.7 2 |2015-04-18 |21.7 |21.7
dB<>在这里小提琴
您可以使用子查询联接表,该子查询按日期恢复第一个非空 BMI:
select
t.*,
x.bmi first_non_null_bmi
from mytable t
cross join (select bmi from mytable where bmi is not null order by date limit 1) x
我想你可以做这样的事情..也许会起作用..或者给你任何想法
THEN (select BIM = row_number() over (partition by BIM order by DATE desc/asc)
from Products)
ELSE..
你可以只使用一个子查询:
select bmi.*,
(select bmi2.bmi
from bmi bmi2
where bmi2.id = bmi.id and bmi2.bmi is not null
order by bmi2.date
limit 1
) as first_bmi
from bmi;