Повторить предыдущее значение столбца в SQL

#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 имеются достоверные данные.