【发布时间】:2021-09-10 04:27:05
【问题描述】:
我希望对除“第一个”之外的所有空值的列进行“级联”更新。顺序由日期升序确定。 我有这张桌子
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[StockA]
(
[date] [date] NOT NULL,
[PercentChange] [decimal](19, 6) NULL,
[Price] [decimal](16, 2) NULL
) ON [PRIMARY]
GO
INSERT INTO [dbo].[StockA] ([date], [PercentChange], [Price])
VALUES (CAST(N'2021-08-19' AS Date), CAST(-0.005100 AS Decimal(19, 6)), NULL)
INSERT INTO [dbo].[StockA] ([date], [PercentChange], [Price])
VALUES (CAST(N'2021-08-20' AS Date), CAST(0.013000 AS Decimal(19, 6)), NULL)
INSERT INTO [dbo].[StockA] ([date], [PercentChange], [Price])
VALUES (CAST(N'2021-08-23' AS Date), CAST(0.015400 AS Decimal(19, 6)), NULL)
INSERT INTO [dbo].[StockA] ([date], [PercentChange], [Price])
VALUES (CAST(N'2021-08-24' AS Date), CAST(0.009500 AS Decimal(19, 6)), NULL)
INSERT INTO [dbo].[StockA] ([date], [PercentChange], [Price])
VALUES (CAST(N'2021-08-18' AS Date), CAST(0.010000 AS Decimal(19, 6)), CAST(100.00 AS Decimal(16, 2)))
GO
SELECT *
FROM StockA
ORDER BY date ASC
四个 NULL 值应根据前一个值计算,从日期 2021-08-19 的第一个 NULL 值开始计算为 100(这是前一个值)* (1+PercentChange) = 99.49
我试过了
WITH CTE AS
(
SELECT
date, PercentChange, Price,
(LAG(Price) OVER (Order by date))*(1+PercentChange) AS NextPrice
FROM
StockA
)
UPDATE CTE
SET Price = NextPrice;
这错误地给了我这个:
计算是正确的。 2021-08-19 行应该是 99.49。那里没有错。但是我的更新声明显然有问题。如果我再次运行我的 CTE 查询,正确的值会添加到下一行并从上一行消失。
有人知道如何填充整个“价格”列,这样就没有空值,计算值基于“第一”(按日期升序排列)价格?
我正在使用 SQL Server 2019。
【问题讨论】:
标签: sql-server tsql