加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

SQL:如何用前一行值填充空单元格?

发布时间:2020-12-12 06:35:01 所属栏目:MsSql教程 来源:网络整理
导读:我需要在不使用循环和相关子查询的情况下使用SQL生成下表中的“required”列.这在SQL 2008中是否可行? Date Customer Value Required Rule20100101 1 12 1220100101 2 0 If no value assign 020100101 3 32 3220100101 4 42 4220100101 5 15 1520100102 1 12
我需要在不使用循环和相关子查询的情况下使用SQL生成下表中的“required”列.这在SQL 2008中是否可行?
Date    Customer   Value   Required   Rule
20100101       1      12         12
20100101       2                  0   If no value assign 0
20100101       3      32         32
20100101       4      42         42
20100101       5      15         15
20100102       1                 12   Take last known value
20100102       2                  0   Take last known value
20100102       3      39         39
20100102       4                 42   Take last known value
20100102       5      16         16
20100103       1      13         13
20100103       2      24         24
20100103       3                 39   Take last known value
20100103       4                 42   Take last known value
20100103       5      21         21
20100104       1      14         14
20100104       2                 24   Take last known value
20100104       3                 39   Take last known value
20100104       4      65         65
20100104       5      23         23

基本上我正在为该客户填充具有最后知道值的空“值”单元格.请记住,最后一行可能没有有效值,因此您必须使用有效值从之前的行中选择它.

解决方法

法伊兹,

如果以下查询怎么样,它根据我的理解做你想做的事情.评论解释了每一步.看看联机丛书上的CTE.甚至可以更改此示例以使用SQL 2008的新MERGE命令.

/* Test Data & Table */
DECLARE @Customers TABLE
    (Dates datetime,Customer integer,Value integer) 

    INSERT  INTO @Customers
    VALUES  ('20100101',1,12),('20100101',2,NULL),3,32),4,42),5,15),('20100102',39),16),('20100103',13),24),21),('20100104',14),65),23) ;

/* CustCTE - This gives us a RowNum to allow us to build the recursive CTE CleanCust */
WITH    CustCTE
          AS (SELECT    Customer,Value,Dates,ROW_NUMBER() OVER (PARTITION BY Customer ORDER BY Dates) RowNum
              FROM      @Customers),/* CleanCust - A recursive CTE. This runs down the list of values for each customer,checking the Value column,if it is null it gets the previous non NULL value.*/
        CleanCust
          AS (SELECT    Customer,ISNULL(Value,0) Value,/* Ensure we start with no NULL values for each customer */
                        Dates,RowNum
              FROM      CustCte cur
              WHERE     RowNum = 1
              UNION ALL
              SELECT    Curr.Customer,ISNULL(Curr.Value,prev.Value) Value,Curr.Dates,Curr.RowNum
              FROM      CustCte curr
              INNER JOIN CleanCust prev ON curr.Customer = prev.Customer
                                           AND curr.RowNum = prev.RowNum + 1)

/* Update the base table using the result set from the recursive CTE */
    UPDATE trg
    SET Value = src.Value
    FROM    @Customers trg
    INNER JOIN CleanCust src ON trg.Customer = src.Customer
                                AND trg.Dates = src.Dates

/* Display the results */
SELECT * FROM @Customers

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读