Sql 使用上一行更新行
我有下表: 我正在尝试编写一个更新,用先前大于零的值填充零 我尝试过以下问题,但没有成功 一, 如果有人能帮助我,我将非常感激Sql 使用上一行更新行,sql,asp.net,sql-server,tsql,azure-sql-database,Sql,Asp.net,Sql Server,Tsql,Azure Sql Database,我有下表: 我正在尝试编写一个更新,用先前大于零的值填充零 我尝试过以下问题,但没有成功 一, 如果有人能帮助我,我将非常感激 感谢SQL Server中的一种方法使用可更新的CTE和窗口函数: with toupdate as ( select tl.*, max(Q_G_R_BUOM) over (partition by grp) as imputed_Q_G_R_BUOM from (select tl.*,
感谢SQL Server中的一种方法使用可更新的CTE和窗口函数:
with toupdate as (
select tl.*,
max(Q_G_R_BUOM) over (partition by grp) as imputed_Q_G_R_BUOM
from (select tl.*,
sum(case when Q_G_R_BUOM <> 0 then 1 else 0 end) over (order by id) as grp
from testing_lag tl
) tl
)
update toupdate
set Q_G_R_BUOM = imputed_Q_G_R_BUOM
where Q_G_R_BUOM = 0;
这个怎么样
--DROP TABLE #C
CREATE TABLE #C (ID INT, Q_G_R_BUOM INT)
INSERT INTO #C values(1, 1805)
INSERT INTO #C values(2, 0)
INSERT INTO #C values(3, 0)
INSERT INTO #C values(4, 4732)
INSERT INTO #C values(5, 0)
INSERT INTO #C values(6, 0)
select * from #c
如果您的表中有空值,则解决方案会有所不同
SELECT ID,CASE WHEN Q_G_R_BUOM >0
THEN Q_G_R_BUOM
ELSE (SELECT max(Q_G_R_BUOM)
FROM #C
WHERE ID <= t.ID)
END AS X
FROM #C t
感谢您的回答,请评论更新必须基于Asc ID,此查询是否以这种方式工作?@LaurenorubioaGuillar。这两个答案都依赖于
id
来定义表的顺序。两者都采用基于id的“previous”非0
值。非常感谢您的支持
update tl
set q_g_r_buom = tl2.q_g_r_buom
from test_lag tl cross apply
(select top (1) tl2.*
from test_lag tl2
where tl2.q_g_r_buom <> 0 and
tl2.id < tl.id
order by tl2.id
) tl2
where tl.q_g_r_buom = 0
--DROP TABLE #C
CREATE TABLE #C (ID INT, Q_G_R_BUOM INT)
INSERT INTO #C values(1, 1805)
INSERT INTO #C values(2, 0)
INSERT INTO #C values(3, 0)
INSERT INTO #C values(4, 4732)
INSERT INTO #C values(5, 0)
INSERT INTO #C values(6, 0)
select * from #c
SELECT ID,CASE WHEN Q_G_R_BUOM >0
THEN Q_G_R_BUOM
ELSE (SELECT max(Q_G_R_BUOM)
FROM #C
WHERE ID <= t.ID)
END AS X
FROM #C t
DROP TABLE #C
CREATE TABLE #C (ID INT, Q_G_R_BUOM INT)
INSERT INTO #C values(1, 1805)
INSERT INTO #C values(2, null)
INSERT INTO #C values(3, null)
INSERT INTO #C values(4, 4732)
INSERT INTO #C values(5, null)
INSERT INTO #C values(6, null)
select * from #c
SELECT ID,
COALESCE(Q_G_R_BUOM,
MAX(COALESCE(Q_G_R_BUOM,'')) OVER (ORDER BY ID ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING)) AS Name
FROM #c