如何扫描表格的每一行,并根据前一行更新当前行?

3

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

  1. 如果当前行为空,则将其设置为前一行
  2. 如果当前行不为空,则不做任何操作

第一行不为空,但随机出现 NULL

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

例如:

 1. 1
 2. null
 3. null
 4. 2
 5. null
 6. null

需要更新为

 1. 1
 2. 1
 3. 1
 4. 2
 5. 2
 6. 2

如何在SQL中实现?

谢谢 r


请添加您尝试过的内容。 - Kemal Güler
你可以使用 SQL Server 的 LAG 函数。你正在使用哪个版本的 SQL Server? - Paresh J
1
你也可以使用递归 SQL 来解决这个问题。 - Esteban P.
5个回答

0
如果连续出现两个Null值,您需要定义表中最小的非空值,因此我认为Outer Apply将解决您的问题。
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,它将不会给您结果,因为您没有定义此情况的逻辑。

如果行(i)为空,则行(i) = 行(i-1),从第一行开始... - user3814384
你在随机中是什么意思?你能举个例子来说明你在谈论什么吗?而且这个逻辑并不能解决它? - Tedo G.

0

这可能会有所帮助:

    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;

结果

output


0
你在哪里使用这个SQL代码?如果你正在使用Hive SQL,那么有一个函数可以让你直接获取最后一个非空值:
LAST_VALUE(col, true) over (PARTITION BY id ORDER BY date)

Oracle 10g也有一个函数可以实现这个功能,如下面的帖子所述:

使用Oracle SQL将空值填充为最后一个非空值

你熟悉窗口函数吗?


0
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

0

尝试下面的脚本。(适用于sql 2008 +)

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

编辑这个脚本,使用"UNBOUNDED PRECEDING"

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

请查看关于“OVER子句”的链接https://learn.microsoft.com/en-us/sql/t-sql/queries/select-over-clause-transact-sql


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接