Sql 如何扫描表中的每一行,并基于上一行更新当前行?

Sql 如何扫描表中的每一行,并基于上一行更新当前行?,sql,sql-server,Sql,Sql Server,我需要使用以下逻辑更新当前行: 如果当前行为空,则将其设置为上一行 如果当前行不为空,则不执行任何操作 第一行不为null,则null随机出现 这些空值需要使用前面提到的逻辑进行更新 e、 g 需要更新为 1. 1 2. 1 3. 1 4. 2 5. 2 6. 2 如何在SQL中实现这一点 谢谢 r如果一行中有两个空值,您需要定义表中最小的非空值,因此我认为外部应用将解决您的问题: CREATE TABLE #TB(ID Int Identity(1, 1), Value Int)

我需要使用以下逻辑更新当前行:

如果当前行为空,则将其设置为上一行 如果当前行不为空,则不执行任何操作 第一行不为null,则null随机出现

这些空值需要使用前面提到的逻辑进行更新

e、 g

需要更新为

 1. 1
 2. 1
 3. 1
 4. 2
 5. 2
 6. 2
如何在SQL中实现这一点

谢谢 r

如果一行中有两个空值,您需要定义表中最小的非空值,因此我认为外部应用将解决您的问题:

CREATE TABLE #TB(ID Int Identity(1, 1), Value Int)
INSERT INTO #TB([Value]) VALUES(1),(Null),(Null),(2),(Null),(Null)

UPDATE G SET G.Value = GG.Value
FROM 
    #TB AS G
        OUTER APPLY
    (SELECT
        TOP 1 *
    FROM
        #TB AS GG
    WHERE
        GG.Value IS NOT NULL
        AND
        GG.ID < G.ID
    ORDER BY
        GG.ID DESC
    ) AS GG
WHERE
    G.Value IS NULL

SELECT * FROM #TB AS T
但请注意,如果第一个值为Null,则不会给出结果,因为您尚未定义此场景的逻辑。

这可能会有帮助:

    SELECT
      t1.col1,
      t1.col2 AS previous,
      (SELECT
        t2.col2
      FROM table_1 t2
      WHERE t2.col1 = (SELECT
        MAX(t3.col1)
      FROM table_1 t3
      WHERE t3.col1 <= t1.col1
      AND col2 IS NOT NULL))
      AS new
    FROM table_1 t1;
结果


您在哪里使用此SQL代码?例如,如果您使用的是配置单元SQL,则有一个函数允许您直接获取最后一个非空值:

LAST_VALUE(col, true) over (PARTITION BY id ORDER BY date)
Oracle 10g也有这样一个功能,如本线程中所述:


你熟悉窗口的功能吗

试试下面的脚本。sql 2008+

while (select count(*) FROM Table_1 where c1_derived = '') > 0
begin
    update top(1) Table_1
    set c1_derived = (select c1_derived from Table_1 t2 where (t2.id = [Table_1].id-1))
    where c1_derived = ''
end
CREATE TABLE #table(id Int Identity(1, 1), value Int)
INSERT INTO #table([Value]) VALUES(1),(Null),(Null),(2),(Null),(Null)


;WITH cte AS
 (
    SELECT ID,Value,ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS row
    FROM #table
 ) 
 SELECT a.ID,max(b.Value) 
FROM cte a
    INNER JOIN cte b ON a.row >=b.row
 GROUP BY a.ID

 drop table #table
Edit2这也是另一个使用无界前缀的脚本 检查这个关于OVER子句的链接

请添加您尝试过的内容。您可以使用sql server的滞后功能。您使用的是哪个版本的SQL server?您还可以使用递归SQL语句来解决它,例如,如果rowi=null,那么rowi=rowi-1,从Row1开始…随机是什么意思?你能举出一个例子来说明你在说什么,而这个逻辑并不能解决这个问题吗?
CREATE TABLE #table(id Int Identity(1, 1), value Int)
INSERT INTO #table([Value]) VALUES(1),(Null),(Null),(2),(Null),(Null)


;WITH cte AS
 (
    SELECT ID,Value,ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS row
    FROM #table
 ) 
 SELECT a.ID,max(b.Value) 
FROM cte a
    INNER JOIN cte b ON a.row >=b.row
 GROUP BY a.ID

 drop table #table
CREATE TABLE #table(id Int Identity(1, 1), value Int)
INSERT INTO #table([Value]) VALUES(1),(Null),(Null),(2),(Null),(Null)

select *   ,max(t.value)  over(order by Id Rows UNBOUNDED PRECEDING) maxValue
from #table t


drop table #table