Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Oracle/Sybase SQL - Wert basierend auf einem vorherigen Datensatz abrufen (keine einfache LAG)

Eine Möglichkeit, dies zu tun, sind verschachtelte Ranking-Funktionen. Weisen Sie zuerst allem, was einen Wert erhält, einen konstanten Wert zu (mithilfe von max() over). ) und diese dann als Partition verwenden.

select t.Invoice_Id, t.Invoice_Line, t.Kit_Flag, t.Part_Number,
       max(KitPart) over (partition by invoice_id, KitNum) as Parent_Part
from (select t.*,
             sum(isKit) over (partition by InvoiceId order by InvoiceLine) as KitNum
      from (select t.Invoice_Id, t.Invoice_Line, t.Kit_Flag, t.Part_Number,
                   (case when Kit_Flag = 'K' then 1 else 0 end) as IsKit,
                   (case when Kit_Flag = 'K' then Part_Number end) as KitPart
            from Invoice_Data t
           ) t
     ) t