SQL Server用最后一个值替换NULL [重复]

Posted

技术标签:

【中文标题】SQL Server用最后一个值替换NULL [重复]【英文标题】:SQL Server replace NULL by the last value [duplicate] 【发布时间】:2020-07-08 06:27:46 【问题描述】:

我想找到一种方法将 NULL 值替换为最后一个非 NULL 值。 我有一张像这样的桌子:

Date        Cost
2017-01-01  18.6046511
2017-01-03  22.9787234
2017-01-03  NULL
2017-01-12  18.8584937
2017-01-16  19.1827852
2017-01-16  NULL
2017-01-19  NULL
2017-02-21  NULL
2017-03-04  24.0597622
2017-03-28  NULL
2017-04-17  33.5398414
2017-04-17  NULL

我想用最后一个非 NULL 值替换 NULL 值 所以结果会是这样的:

Date        Cost
2017-01-01  18.6046511
2017-01-03  22.9787234
2017-01-03  22.9787234
2017-01-12  18.8584937
2017-01-16  19.1827852
2017-01-16  19.1827852
2017-01-19  19.1827852
2017-02-21  19.1827852
2017-03-04  24.0597622
2017-03-28  24.0597622
2017-04-17  33.5398414
2017-04-17  33.5398414

【问题讨论】:

tomaztsql.wordpress.com/2018/08/05/… 您使用的是什么版本的 SQL Server? 【参考方案1】:

您可以通过使用窗框 (GUWF) 创建组来尝试以下查询。 source link.

create table MyTable ([dtDate] date, Cost decimal(18, 6))
insert into MyTable values 
('2017-01-01',  18.6046511),
('2017-01-03',  22.9787234),
('2017-01-03',  NULL),
('2017-01-12',  18.8584937),
('2017-01-16',  19.1827852),
('2017-01-16',  NULL),
('2017-01-19',  NULL),
('2017-02-21',  NULL),
('2017-03-04',  24.0597622),
('2017-03-28',  NULL),
('2017-04-17',  33.5398414),
('2017-04-17',  NULL)

SELECT dtDate, Cost = MAX(Cost) OVER (PARTITION BY c)
FROM
(
    SELECT dtDate, Cost
        ,c = count(Cost) OVER (ORDER BY dtDate)
    FROM MyTable
) a
ORDER BY dtDate;

Live Demo

【讨论】:

@GordonLinoff 请检查此db<>fiddle link,它也适用于降低成本值。【参考方案2】:

如果当前值为空,则返回日期小于或等于当前日期的第一个值。

SELECT *, ISNULL(Value, (SELECT TOP 1 Value FROM SomeTable WHERE Date <= t.Date AND Value IS NOT NULL ORDER BY ID DESC))
FROM SomeTable t

这没有经过测试,只是从头开始写的。

【讨论】:

在选择中执行子查询对性能非常不利 @PrebenHuybrechts - 这是一个通常不正确的大规模概括。

以上是关于SQL Server用最后一个值替换NULL [重复]的主要内容,如果未能解决你的问题,请参考以下文章

SQL-Server:继续最后一个值而不是 NULL,分区不正确

sql [sql]将多行合并并组合成一个,同时用其他数据替换NULL值。

SQL Server 排序的时候使 null 值排在最后

SQL Server 排序的时候使 null 值排在最后

sql如何空值替换成null?

sql server 如何改变计算结果的值 如null改变为0