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,分区不正确