HSQLDB 使用先前的非空值更新空条目
HSQLDB update null entries with the previous not null value
我如何更新所有条目的空值以及之前的非空行?
例如:
create table users (
id int primary key,
create_date date
);
实际条目
id create_date
2 2018-12-03
3 NULL
4 2018-12-04
5 NULL
6 NULL
更新后 Table 个条目:
id create_date
2 2018-12-03
3 2018-12-03
4 2018-12-04
5 2018-12-04
6 2018-12-04
在SQL标准中,可以使用lag(ignore nulls)
:
select id,
coalesce(create_date, lag(create_date ignore nulls) over (order by id)) as imputed_create_date
from t;
并非所有数据库都支持该选项。因此,另一种方法是根据该行的非 NULL
值的数量为每一行分配一个分组。然后,非NULL
值可以分布在组中:
select t.*,
max(create_date) over (partition by grp) as imputed_create_date
from (select t.*,
count(create_date) over (order by id) as grp
from t
) t
您需要从 ID 小于当前(更新中)行的行中 select CREATE_DATE 的最大值。使用此最大值更新具有 NULL 值的行。它非常简单,不需要 window 个函数。
UPDATE USERS U SET
CREATE_DATE = (SELECT MAX(CREATE_DATE) FROM USERS USUB WHERE USUB.ID < U.ID)
WHERE U.CREATE_DATE IS NULL
以上语句假定日期相对于 ID(您的示例)按升序排列。如果不是这种情况,您可以使用此语句 select CREATE_DATE 恰好是最后一个非空值。
UPDATE USERS U SET
CREATE_DATE = (SELECT CREATE_DATE FROM USERS USUB WHERE USUB.ID < U.ID AND USUB.CREATE_DATE IS NOT NULL ORDER BY USUB.ID DESC LIMIT 1)
WHERE U.CREATE_DATE IS NULL
我如何更新所有条目的空值以及之前的非空行?
例如:
create table users (
id int primary key,
create_date date
);
实际条目
id create_date
2 2018-12-03
3 NULL
4 2018-12-04
5 NULL
6 NULL
更新后 Table 个条目:
id create_date
2 2018-12-03
3 2018-12-03
4 2018-12-04
5 2018-12-04
6 2018-12-04
在SQL标准中,可以使用lag(ignore nulls)
:
select id,
coalesce(create_date, lag(create_date ignore nulls) over (order by id)) as imputed_create_date
from t;
并非所有数据库都支持该选项。因此,另一种方法是根据该行的非 NULL
值的数量为每一行分配一个分组。然后,非NULL
值可以分布在组中:
select t.*,
max(create_date) over (partition by grp) as imputed_create_date
from (select t.*,
count(create_date) over (order by id) as grp
from t
) t
您需要从 ID 小于当前(更新中)行的行中 select CREATE_DATE 的最大值。使用此最大值更新具有 NULL 值的行。它非常简单,不需要 window 个函数。
UPDATE USERS U SET
CREATE_DATE = (SELECT MAX(CREATE_DATE) FROM USERS USUB WHERE USUB.ID < U.ID)
WHERE U.CREATE_DATE IS NULL
以上语句假定日期相对于 ID(您的示例)按升序排列。如果不是这种情况,您可以使用此语句 select CREATE_DATE 恰好是最后一个非空值。
UPDATE USERS U SET
CREATE_DATE = (SELECT CREATE_DATE FROM USERS USUB WHERE USUB.ID < U.ID AND USUB.CREATE_DATE IS NOT NULL ORDER BY USUB.ID DESC LIMIT 1)
WHERE U.CREATE_DATE IS NULL