SQL使用最后观察到的值填充nan
编写SQL查询,用最后一个已知值填充值列NAN。SQLite 客户识别码 日期 价值 1. 14.04.2020 10000 1. 15.04.2020 5000 1. 16.04.2020 楠 1. 17.04.2020 楠 1. 18.04.2020 楠 2. 14.04.2020 250000 2. 15.04.2020 250000 2. 16.04.2020 230000 2. 17.04.2020 230000 2. 18.04.2020 225000 3. 14.04.2020 50000 3. 15.04.2020 楠 3. 16.04.2020 楠SQL使用最后观察到的值填充nan,sql,window-functions,Sql,Window Functions,编写SQL查询,用最后一个已知值填充值列NAN。SQLite 客户识别码 日期 价值 1. 14.04.2020 10000 1. 15.04.2020 5000 1. 16.04.2020 楠 1. 17.04.2020 楠 1. 18.04.2020 楠 2. 14.04.2020 250000 2. 15.04.2020 250000 2. 16.04.2020 230000 2. 17.04.2020 230000 2. 18.04.2020 225000 3. 14.04.2020 5
从“NaN”的用法我猜你在使用Postgres 不幸的是,Postgres不支持窗口函数上的忽略NULL选项。一种方法是将一个组分配给数字,然后为该组输入值:
select t.*,
max(nullif(value, 'NaN')) over (partition by grp) as imputed_value
from (select t.*,
count(value) filter (where value <> 'NaN') over (partition by client_id order by date) as grp
from t
) t
或使用横向连接:
select t.*, t2.value as imputed_value
from t cross join lateral
(select t2.value
from t t2
where t2.client_id = t.client_id and
t2.date <= t.date and
t2.value <> 'NaN'
order by t2.date desc
limit 1
) t2;
是一个数据库。用你正在使用的数据库标记你的问题。很好。但第一种方法在添加多个客户机id时出错。另外,我使用SQLite来完成此任务,而不是Postgres,我忘了说。
select t.*, t2.value as imputed_value
from t cross join lateral
(select t2.value
from t t2
where t2.client_id = t.client_id and
t2.date <= t.date and
t2.value <> 'NaN'
order by t2.date desc
limit 1
) t2;