簡體   English   中英

SQL - 檢查前一行,直到找到請求的值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM