sql - 用值替换 NULL

标签 sql sql-server sql-server-2012

这是我的挑战: 我有一个日志表,每次更改记录时都会添加一条新记录,但为每个记录中的每个未更改值放置一个 NULL 值。换句话说,仅设置更改的值,每行中其余未更改的字段仅具有 NULL 值。 现在我想将每个 NULL 值替换为其上面的非 NULL 值,如下所示:

源表:Task_log

ID  Owner       Status      Flag
1   Bob         Registrar   T
2   Sue         NULL        NULL
3   NULL        NULL        F
4   Frank       Admission   T
5   NULL        NULL        F
6   NULL        NULL        T

期望输出表:Task_log

ID  Owner       Status      Flag
1   Bob         Registrar   T
2   Sue         Registrar   T
3   Sue         Registrar   F
4   Frank       Admission   T
5   Frank       Admission   F
6   Frank       Admission   T

如何编写一个查询来生成所需的输出表?

最佳答案

SQLServer 2012新的窗口函数是FIRST_VALUE,它的名字很直接,可以通过OVER子句进行分区,使用前需要先划分数据 block 中的每一列,当找到一个值时,一个列的 block 开始。

With Block As (
  Select ID
       , Owner
       , OBlockID = SUM(Case When Owner Is Null Then 0 Else 1 End) 
                    OVER (ORDER BY ID)
       , Status
       , SBlockID = SUM(Case When Status Is Null Then 0 Else 1 End) 
                    OVER (ORDER BY ID)
       , Flag
       , FBlockID = SUM(Case When Flag Is Null Then 0 Else 1 End) 
                    OVER (ORDER BY ID)
  From   Task_log
)
Select ID
     , Owner = FIRST_VALUE(Owner) OVER (PARTITION BY OBlockID ORDER BY ID)
     , Status = FIRST_VALUE(Status) OVER (PARTITION BY SBlockID ORDER BY ID)
     , Flag = FIRST_VALUE(Flag) OVER (PARTITION BY FBlockID ORDER BY ID)
FROM   Block

SQLFiddle演示

UPDATE 查询很容易派生

关于sql - 用值替换 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23574193/

相关文章:

MySQL:在函数中传递日期时间列

sql-server - 如何在sql server enterprise manager studio中保存触发器

t-sql - 按行的出现次数分组

sql-server-2012 - 如何启用SQL Server 2012 FileTable文件夹共享权限?

mysql - MySQL通配符字符串选择

mysql - 无法删除 MySQL 表

sql - 将 DATETIME 舍入到午夜

SQL Server : there are no primary or candidate keys in the referenced table that match the referencing column list in the foreign key 'FK'

sql-server - 以下 SQL Server 声明 : datetime2(7)? 的含义是什么

php - 无法从 php 调用 sql 连接