复制相同的值,直到SQL Server中出现新值

时间:2018-05-10 14:38:16

标签: sql-server

我的表格中有以下数据

Name Break 
AA    1      
BB    1      
CC           
DD           
EE    1      
FF            
GG    1      

现在我想要下面的结果。

规则就像更新名称列中名称列的副本值,直到找到 1 in break 列。

Name Break UpdatedName
AA    1      AA
BB    1      BB
CC           BB
DD           BB
EE    1      EE 
FF           EE 
GG    1      GG 

如何获得上述结果?

3 个答案:

答案 0 :(得分:1)

使用"窗口"子查询。

IF OBJECT_ID('tempdb..#Names') IS NOT NULL
    DROP TABLE #Names

CREATE TABLE #Names (
    Name VARCHAR(2),
    Breaks INT)

INSERT INTO #Names (
    Name,
    Breaks)
VALUES
    ('A', 1),
    ('B', 1),
    ('C', NULL),
    ('D', NULL),
    ('E', 1),
    ('F', NULL),
    ('G', 1)

SELECT
    N.Name,
    N.Breaks,
    UpdatedName = (SELECT MAX(X.Name) FROM #Names AS X WHERE X.Name <= N.Name AND X.Breaks = 1)
FROM
    #Names AS N

答案 1 :(得分:1)

试试这个

DECLARE @Data AS TABLE(Name VARCHAr(10), [Break] INt)
INSERT INTO @Data

SELECT 'AA',1 UNION ALL  
SELECT 'BB',1 UNION ALL     
SELECT 'CC',NULL  UNION ALL     
SELECT 'DD',NULL  UNION ALL     
SELECT 'EE',1 UNION ALL     
SELECT 'FF',NULL  UNION ALL      
SELECT 'GG',1 

SELECT Name,[Break],
      IIF([Break]=1,Name,LAG(Name,1)OVER(ORDER BY  Name)) AS UpdatedName
 FROM @Data

结果/演示http://rextester.com/SGIB7287

答案 2 :(得分:1)

您也可以使用嵌套的Select查询,如下所示 see live demo

注意:我假设名称不一定按字母顺序排列

; with cte as 
(select rn=row_number() over (order by (select NULL)), * from tbl)

select 
c1.Name, 
c1.[Break],
updateValue= 
 case 
   when c1.[break] is not null 
   then C1.Name 
   else
(
   select 
     TOP 1 
     c2.Name 
   from cte c2 
   where c2.rn<c1.rn 
   and c2.[break] is NOT NULL 
   order BY rn desc
) end
from cte c1  
    order by c1.rn