SQL - проверять предыдущую строку, пока не будет найдено запрошенное значение - PullRequest
2 голосов
/ 10 июля 2020

У меня есть набор данных, как показано ниже:

ID   ReportingDate  Status
123  05/05/2020     GREEN
123  12/05/2020     NONE
123  19/05/2020     NONE
123  26/05/2020     AMBER
123  02/06/2020     RED
123  09/06/2020     NONE
123  16/06/2020     GREEN
123  23/06/2020     NONE
123  30/06/2020     AMBER

Я хочу игнорировать статусы NONE и взять предыдущее значение, которое может быть предыдущей строкой, но иногда на 2 или 3 строки раньше. По сути, окончательный результат должен соответствовать столбцу «FINAL»

ID   ReportingDate  Status   FINAL
123  05/05/2020     GREEN    GREEN 
123  12/05/2020     NONE     GREEN
123  19/05/2020     NONE     GREEN
123  26/05/2020     AMBER    AMBER
123  02/06/2020     RED      RED
123  09/06/2020     NONE     RED
123  16/06/2020     GREEN    GREEN
123  23/06/2020     NONE     GREEN
123  30/06/2020     AMBER    AMBER

Я пытался использовать функции LAG () или LEAD (), но они не работают должным образом.

UPPER
(
   CASE 
      WHEN psh.Status = 'NONE'
      THEN LAG(psh.Status,1,psh.Status) OVER
           (
              PARTITION BY psh.ID 
              ORDER BY rp.ReportingDate
           ) 
      ELSE psh.Status 
   END
) AS OverallStatusHistory

Не могли бы вы мне посоветовать, если есть способ как этого добиться, пожалуйста?

Большое спасибо!

1 Ответ

0 голосов
/ 10 июля 2020

Вы можете назначать группы на основе количества значений, отличных от 'NONE'. Затем распределите значение:

select t.*,
       max(nullif(status, 'NONE')) over (partition by id, grp) as imputed_status
from (select t.*,
             sum(case when status = 'NONE' then 0 else 1 end) over (partition by id order by reportingdate) as grp
      from t
     ) t;

Здесь - скрипт db <>.

Стандарт SQL фактически поддерживает опцию IGNORE NULLS на LAG() (и различные другие оконные функции). Это позволило бы решить эту проблему без подзапроса. К сожалению, SQL Сервер (пока ???) не поддерживает эту функцию.

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