#sql #sql-server #database #loops
#sql #sql-сервер #База данных #циклы
Вопрос:
Я хочу знать, возможно ли повторить значение текущей строки, пока я не найду другую, а затем повторить это
КОГДА 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 это число всегда использовалось примерно так
Ответ №1:
Да, вы можете это сделать. Идеальным способом было бы использовать 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()
для этой группы, чтобы распространить значение по всем строкам в группе.
Наконец, внешний запрос выбирает между code
и code2
.
Здесь используется db<>fiddle.
Комментарии:
1. Спасибо! вы великолепны, можете ли вы объяснить мне, для чего используется «СУММА», которую вы там используете
2. @MarcosMSorianoA . . . То есть назначить «группу» на основе того, когда
code2
имеются достоверные данные.