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

Sql server 复制相同的值,直到SQL Server中出现新值,sql-server,Sql Server,我的表中有以下数据 Name Break AA 1 BB 1 CC DD EE 1 FF GG 1 现在我想要下面的结果 该规则类似于在更新的名称列中复制名称列的值,直到在中断列中找到1为止 如何获得上述结果?使用带窗口的子查询 IF OBJECT_ID('tempdb..#Names') IS NOT NULL DROP TABLE #Name

我的表中有以下数据

Name Break 
AA    1      
BB    1      
CC           
DD           
EE    1      
FF            
GG    1      
现在我想要下面的结果

该规则类似于在更新的名称列中复制名称列的值,直到在中断列中找到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
试试这个

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

结果/演示

您也可以使用嵌套的选择查询,如下所示

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

; 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

哪一列决定顺序?它是按名字的字母顺序排列的吗?看看这类东西的滞后。不过,您需要的是一种可靠的数据排序方法。可以使用示例数据中的名称,但这作为排序列非常脆弱。使用直接延迟不会拖动超过1行的以前记录。这不是我真正想要的。但这有点接近我的预期。谢谢
; 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