sql - SQL - 检查前一行,直到找到请求的值
问题描述
我有一个如下数据集:
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 行。基本上最终输出应该像“最终”列
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
你能告诉我,如果有办法如何实现它,好吗?
非常感谢!
解决方案
您可以根据非'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<>fiddle。
SQL 标准实际上支持IGNORE NULLS
on 选项LAG()
(以及各种其他窗口函数)。这样就可以在没有子查询的情况下解决这个问题。不幸的是,SQL Server 不(还???)支持该功能。
推荐阅读
- python - What is an efficient way to find the minimum sum of multiple dictionary values, given keys of mutually exclusive integers?
- python - 使用 f.readline() 从文件中读取的行数比实际文件中的行数多
- javascript - 如何从 Firebase 中检索特定数据
- c# - 在 WinForm 中将控件添加到面板中的问题
- azure - 我在哪里可以在 azure 中看到我自己的 vm 和网络安全组?
- vue.js - 如何为某个数据值执行一次方法
- batch-file - 批处理文件:按X以外的任意键退出
- python - 迭代多列熊猫
- python - how to check if a list of sub-strings is in a list (python)
- c++ - 使用任何数字返回数字的无符号函数