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

ars1skjm  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(257)

我的数据集如下:

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状态并取previous值,它可能是前一行,但有时是前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

你能告诉我,如果有办法的话,请告诉我?
非常感谢!

mxg2im7a

mxg2im7a1#

您可以根据非- '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标准实际上支持 IGNORE NULLS 选项开启 LAG() (以及其他各种窗口功能)。这样就可以在没有子查询的情况下解决这个问题。不幸的是,SQLServer还不支持这个功能。

相关问题