我的数据组织如下:
Invoice_Id Invoice_Line Kit_Flag Part_Number ---------- ------------ -------- ----------- AB12345 1 K KT-1234A AB12345 2 C 1234567 AB12345 3 C 1234568 AB12345 4 C 1234569 AB12345 5 C 1234560 AB12345 6 K KT-1234C AB12345 7 C 1234561 AB12345 8 C 1234562 AB12345 9 K KT-1234Q AB12345 10 C 5678901 AB12345 11 C 1234561 AB12345 12 C 1234562
我试图从单个Invoice_Id(K =父级,C =子级)中,从Kit_Flag为’K’的最后一行获取后续行的Part_Number值。为了简单起见,我在这里只列出了一个发票ID。
因此,对于以上数据,结果将如下所示:
Invoice_Id Invoice_Line Kit_Flag Part_Number Parent_Part ---------- ------------ -------- ----------- ------------ AB12345 1 K KT-1234A KT-1234A AB12345 2 C 1234567 KT-1234A AB12345 3 C 1234568 KT-1234A AB12345 4 C 1234569 KT-1234A AB12345 5 C 1234560 KT-1234A AB12345 6 K KT-1234C KT-1234C AB12345 7 C 1234561 KT-1234C AB12345 8 C 1234562 KT-1234C AB12345 9 K KT-1234Q KT-1234Q AB12345 10 C 5678901 KT-1234Q AB12345 11 C 1234561 KT-1234Q AB12345 12 C 1234562 KT-1234Q
在Excel中,可以通过“ = If(C2 =“ K”,C3,D2)”之类的方法来实现,而这实际上是我们暂时必须解决的问题,但是我正在尝试实现这一点的自动化。
该表位于Oracle 9i和Sybase上,但是Sybase实例不具有分析功能。
我认为这行不通(而且行不通),但从概念上讲,它表明了我正在尝试做的事情:
select t.Invoice_Id, t.Invoice_Line, t.Kit_Flag, t.Part_Number, case when Kit_Flag = 'K' then Part_Number else lag(Parent_Part, 1) over (partition by Invoice_Id order by Invoice_Line) end as Parent_Part from Invoice_Data t
欢迎任何建议和/或指导。
一种方法是使用嵌套排名功能。首先,为所有获得一个值的常量分配一个常量值(使用max() over),然后将其用作分区。
max() over
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