Повторите предыдущее значение столбца в SQL - PullRequest
0 голосов
/ 23 марта 2019

Я хочу знать, возможно ли повторить значение текущей строки, пока я не найду другую, а затем повторить, что

КОГДА ДАТА = 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

this is the result

но число 22 просто повторяется один раз, и я хочу, чтобы с момента появления 22 использовать это число всегда было примерно так:

this is what I want

1 Ответ

1 голос
/ 23 марта 2019

Да, вы можете сделать это.Идеальный способ - использовать LAG() с 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.

Здесь - это дБ <> скрипка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...