如何在SQL中获取第一个非NULL 值?



>我有三列数据。一列有 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_VALUEORDER 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;

相关内容

  • 没有找到相关文章

最新更新