Following solution will only work for Oracle database.
Hope it will inspire you for HANA.
Your sample data
create table Sample_Data (item, creation_date, issue_date, qty) as (
select 'a', to_date('05.01.2021', 'DD.MM.YYYY'), to_date('10.01.2021', 'DD.MM.YYYY'), 2 from dual union all
select 'a', to_date('07.01.2021', 'DD.MM.YYYY'), to_date('12.02.2021', 'DD.MM.YYYY'), 3 from dual union all
select 'a', to_date('11.01.2021', 'DD.MM.YYYY'), to_date('12.02.2021', 'DD.MM.YYYY'), 4 from dual union all
select 'b', to_date('05.01.2021', 'DD.MM.YYYY'), to_date('10.05.2021', 'DD.MM.YYYY'), 2 from dual union all
select 'b', to_date('11.01.2021', 'DD.MM.YYYY'), to_date('12.05.2021', 'DD.MM.YYYY'), 3 from dual union all
select 'b', to_date('14.02.2021', 'DD.MM.YYYY'), to_date('15.02.2021', 'DD.MM.YYYY'), 4 from dual
)
;
- First, Within row_numbered_tab view, I numbered all the rows per ITEM (row_number function), and I count all the previous rows per every row
- Second, for each row, I generate as many rows as it has prev_count_rows
- Then, I am able to implement your logic through views t and tt
With row_numbered_tab (ITEM, CREATION_DATE, ISSUE_DATE, QTY, prev_count_rows, rnb) as (
select ITEM, CREATION_DATE, ISSUE_DATE, QTY
, count(ISSUE_DATE)over(partition by ITEM order by CREATION_DATE, ISSUE_DATE ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) prev_count_rows
, row_number()over(partition by ITEM order by CREATION_DATE, ISSUE_DATE) rnb
from Sample_Data t
)
, cte(ITEM, CREATION_DATE, ISSUE_DATE, QTY, prev_count_rows, rnb, RUNNING_REF_CREATION_DATE) as (
select ITEM, CREATION_DATE, ISSUE_DATE, QTY, prev_count_rows, rnb, CREATION_DATE RUNNING_REF_CREATION_DATE
from row_numbered_tab t
union all
select t.ITEM, t.CREATION_DATE, t.ISSUE_DATE, t.QTY, c.prev_count_rows, c.rnb - 1 rnb
, case when t.ITEM = c.ITEM and t.rnb = c.rnb - 1 then c.RUNNING_REF_CREATION_DATE else t.CREATION_DATE end
from row_numbered_tab t
join cte c
on t.rnb = c.rnb - 1
and t.ITEM = c.ITEM
)
select ITEM, CREATION_DATE, ISSUE_DATE, QTY, O_QTY as Open_Quantity
from (
select t.*, max(O_QTY)over(partition by ITEM, prev_count_rows)mx
from (
select ITEM, CREATION_DATE, ISSUE_DATE, QTY, prev_count_rows, RNB, RUNNING_REF_CREATION_DATE
, NVL(
sum(case when RUNNING_REF_CREATION_DATE < ISSUE_DATE then QTY else null end)
over(
partition by ITEM, prev_count_rows order by CREATION_DATE, ISSUE_DATE
ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING
)
, 0
)O_QTY
from cte
) t
)tt
where O_QTY = MX
order by ITEM, CREATION_DATE
;
demo