我想知道是否可以重复当前行的值,直到找到另一行,然后重复该行
当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出现的那一刻起就一直使用该数字
答案 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()
来将值分布在组中的所有行上。
最后,外部查询在code
和code2
之间进行选择。
Here是db <>小提琴。