Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用上一行更新行_Sql_Asp.net_Sql Server_Tsql_Azure Sql Database - Fatal编程技术网

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