【问题标题】:HSQLDB update null entries with the previous not null valueHSQLDB 使用前一个非空值更新空条目
【发布时间】:2020-08-13 11:24:09
【问题描述】:

如何更新前一个非空行的所有条目的空值?

例如:

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

更新后的表格条目:

id  create_date
2   2018-12-03
3   2018-12-03
4   2018-12-04
5   2018-12-04
6   2018-12-04

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。

标签: sql hsqldb


【解决方案1】:

您需要从 ID 小于当前(更新)行的行中选择 CREATE_DATE 的 MAX 值。使用此最大值更新具有 NULL 值的行。很简单,不需要窗口函数。

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 是按升序排列的(您的示例)。如果不是这种情况,您可以使用此语句为最后一个非空值选择 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

【讨论】:

    【解决方案2】:

    在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
    

    【讨论】:

    • 它返回:“错误的 SQL 语法 [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] 意外令牌:("
    • @Valip 。 . .我不认为 HSQLDB 支持窗口函数。您可能希望升级到更符合 SQL 标准的数据库。
    猜你喜欢
    • 2021-06-27
    • 2013-12-14
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    相关资源
    最近更新 更多