在SQL中重复该列的上一个值

时间:2019-03-23 12:37:52

标签: sql sql-server database loops

我想知道是否可以重复当前行的值,直到找到另一行,然后重复该行

当DATE = 201903始终是CODE的值时,我想重复该值,直到找到另一个重复的值。

CREATE TABLE ForgeRock
(
     [id] VARCHAR(13), 
     [code] VARCHAR(57),
     [date] VARCHAR(13),
     [code2] VARCHAR(7)
);

INSERT INTO ForgeRock ([id], [code], [date], [code2])
VALUES (1, 21, 201903, 0),
       (1, 21, 201902, 0),
       (1, 21, 201901, 0),
       (1, 21, 201812, 0),
       (1, 21, 201811, 0),
       (1, 21, 201810, 22),
       (1, 21, 201809, 0),
       (1, 21, 201808, 0),
       (1, 21, 201807, 0);

SELECT
    *,  
    result = (CASE WHEN date = 201903 THEN code
                   WHEN date <> 201903 AND code2 = 0 THEN code
                   ELSE code2 
              END)   
FROM
    ForgeRock

this is the result

但是数字22只是重复一次,我希望从22出现的那一刻起就一直使用该数字

this is what I want

1 个答案:

答案 0 :(得分:1)

是的,您可以这样做。理想的方法是将LAG()IGNORE NULL一起使用,但是SQL Server不支持。所以这是另一种方法:

select fr.*,
       (case when grp = 0 then code else max(code2) over (partition by grp) end) as result
from (select fr.*,
             sum(case when code2 <> 0 then 1 else 0 end) over (order by date desc) as grp
      from ForgeRock fr
     ) fr
order by date desc;

这将为每个code2值的行分配一个“组”。每个新的code2都会生成一个新组。然后,我们可以在该组上使用max()来将值分布在组中的所有行上。

最后,外部查询在codecode2之间进行选择。

Here是db <>小提琴。