![](/img/trans.png)
[英]SQL Lead/Lag until a certain condition and update the previous/next rows with a value from the row that hits the condition
[英]SQL - check previous row until the requested value is found
我有一個如下數據集:
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 行。 基本上最后的 output 應該像“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
你能告訴我,如果有辦法如何實現它,好嗎?
非常感謝!
您可以根據非'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 標准實際上支持LAG()
上的IGNORE NULLS
選項(以及各種其他 window 函數)。 這樣就可以在沒有子查詢的情況下解決這個問題。 不幸的是,SQL 服務器不(還???)支持該功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.