首页 > 解决方案 > 在 SQL 中重复列的前一个值

问题描述

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

WHEN 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

这是结果

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

这就是我要的

标签: sqlsql-serverdatabaseloops

解决方案


是的,你可以这样做。理想的方法是使用LAG()with IGNORE NULLs,但 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()over this group 将值分布到组中的所有行。

最后,外部查询在 和 之间进行code选择code2

是一个 db<>fiddle。


推荐阅读