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

Pra*_*han 4 sql sqlite null

我有三列数据。第一列包含 ID,第二列包含日期,第三列包含 BMI 值。我想创建第四列,该列的第一个值基于第三列的日期(升序),该第三列不为空或避免为空。

到目前为止,我已经尝试过普通形式的first_value,但没有成功。我尝试将 case when 语句内的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
Run Code Online (Sandbox Code Playgroud)

给了我 0。

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
Run Code Online (Sandbox Code Playgroud)

有什么建议么??

Luk*_*rms 6

您可以将其放在的CASE中。 然后,空值将被排在该函数的最后。ORDER BYFIRST_VALUE

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)
;
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
PID | 更新 | 体重指数 | 第一体重指数
:-- | :--------- | :--- | :--------
1 | 2000-01-01 | | 24.9    
1 | 2002-07-15 | 24.9 | 24.9 24.9    
1 | 2003-05-01 | 18.5 | 18.5 24.9    
2 | 2009-09-25 | | 21.7    
2 | 2015-04-18 | 21.7 | 21.7 21.7    

db<>在这里摆弄