sql 复制副本

sql copying duplicates

我正在尝试使用 'Col1' 和 'Col3' 将上述值填充 'Col4' 空值。以下是对列的简要说明:

  • Col1 - 用户输入日期
  • Col2 - 日历日期
  • Col3 - Col1 中日期之间的差异
  • Col4 - 入场金额
  • 目前的数据是什么样的:

     |   Col1          |   Col2          |   Col3       |   Col4
     |   2016-01-01    |   2016-01-01    |   3          |   
     |   null          |   2016-01-02    |   null       |   null
     |   null          |   2016-01-03    |   null       |   null
     |   2016-01-04    |   2016-01-04    |   1          |   
     |   2016-01-05    |   2016-01-05    |   2          |   
     |   null          |   2016-01-06    |   null       |   null
     |   2016-01-07    |   2016-01-07    |   3          |   
     |   null          |   2016-01-08    |   null       |   null
     |   null          |   2016-01-09    |   null       |   null
    
    预期成绩:

     |   Col1          |   Col2          |   Col3       |   Col4
     |   2016-01-01    |   2016-01-01    |   3          |   
     |   null          |   2016-01-02    |   null       |   
     |   null          |   2016-01-03    |   null       |   
     |   2016-01-04    |   2016-01-04    |   1          |   
     |   2016-01-05    |   2016-01-05    |   2          |   
     |   null          |   2016-01-06    |   null       |   
     |   2016-01-07    |   2016-01-07    |   3          |   
     |   null          |   2016-01-08    |   null       |   
     |   null          |   2016-01-09    |   null       |   
    

    该公式的工作原理是计算 Col3 中的数字,然后将 Col4 中的相应数量复制到下面的行中。 Col3 定义下面的行数(包括它自己的行)。

    我目前正在使用 Sybase。我对如何做到这一点没有任何想法。任何帮助将不胜感激谢谢。 注意:这是一个数据样本,日期从 2000 年到 2016 年

    在SQL服务器中通过给定样本数据我们可以使用CTE实现上述结果集

    示例数据:

    declarE  @Table1 TABLE 
        (Col1 varchar(10), Col2 varchar(10), Col3 varchar(4), Col4 varchar(4))
    ;
    
    INSERT INTO @Table1
        (Col1, Col2, Col3, Col4)
    VALUES
        ('2016-01-01', '2016-01-01', '3', ''),
        (NULL, '2016-01-02', NULL, NULL),
        (NULL, '2016-01-03', NULL, NULL),
        ('2016-01-04', '2016-01-04', '1', ''),
        ('2016-01-05', '2016-01-05', '2', ''),
        (NULL, '2016-01-06', NULL, NULL),
        ('2016-01-07', '2016-01-07', '3', ''),
        (NULL, '2016-01-08', NULL, NULL),
        (NULL, '2016-01-09', NULL, NULL)
    ;
    

    脚本:

    WITH cte 
         AS (SELECT T1.Col1, 
                    T1.Col2,
                    T1.Col3, 
    
                    Col4 = COALESCE(T1.Col4, (SELECT TOP 1 Col4 
                                          FROM   @Table1 T2 
                                          WHERE  T2.Col2 < T1.Col2
                                                 AND Col4 IS NOT NULL 
                                          ORDER  BY Col2 DESC)) 
             FROM   @Table1 T1) 
    UPDATE T 
    SET    
           T.Col4 = C.Col4 
    FROM   @Table1 T 
           INNER JOIN cte C 
                   ON T.col2 = C.col2 
    WHERE  T.col1 IS NULL 
            OR T.col2 IS NULL 
            OR T.col3 IS NULL 
    
            Select * from @Table1