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