sql - 在 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 出现的那一刻起,使用该数字总是像这样
解决方案
是的,你可以这样做。理想的方法是使用LAG()
with IGNORE NULL
s,但 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。
推荐阅读
- c# - 重定向功能的异常行为
- php - 带有国家代码的手机号码的正则表达式
- flutter - Flutter Painter 在通过 360 度时绘制带有指示的圆弧
- python - 准确的体位检测
- acumatica - 无法在案例中启用自定义字段
- python - 弃用警告:remove_friend 已弃用。等待 coro(*args, **kwargs)
- android - Android 辅助功能 Chrome 读取 URL 缺少 http 或 https
- r - 如何组合多个向量,使每个向量的元素尽可能均匀分布?
- canvas - 如何将 WebXR 'immersive-xr' HMD 视图镜像/克隆到浏览器
- python - 在模板上使用 for 循环时不会显示来自 Listview 的对象 - Django