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;