这是我的挑战: 我有一个日志表,每次更改记录时都会添加一条新记录,但为每个记录中的每个未更改值放置一个 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
UPDATE
查询很容易派生
关于sql - 用值替换 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23574193/