SQL-检查前一行,直到找到请求的值

SQL-检查前一行,直到找到请求的值,sql,sql-server,Sql,Sql Server,我得到的数据集如下所示: 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/

我得到的数据集如下所示:

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状态并取上一个值,它可能是前一行,但有时是前两行或前三行。基本上,最终输出应该与“final”列类似

我尝试使用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
如果有办法实现的话,你能给我一个建议吗


非常感谢

您可以根据非'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;
他是一把小提琴


SQL标准实际上支持
LAG()
(以及各种其他窗口函数)上的
ignorenulls
选项。这将使得不需要子查询就可以解决这个问题。不幸的是,SQL Server不支持该功能。

我已经提交了一个编辑来设置查询的格式,因为如果您设置了格式,则更容易看到您发布的代码中存在问题。在
='NONE'
谢谢@allmhuran,我已经更正了。谢谢,这似乎很有希望,但仍然没有完全删除“NONE”。@Srpic。哎呀。我通常在
NULL
s中遇到这个问题,而不是像
'NONE'
这样的值。当存在字符串值时,外部
MAX()
无法正常工作。答案是固定的。
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;