One of the options could be to do it using analytic function LAST_VALUE() with dataset prepared with LEVEL ... Connect By filling the missing days:
WITH -- Sample Data
tbl (DT, AMNT) AS
( Select To_date( '02.04.2023', 'dd.mm.yyyy'), 100 From Dual Union All
Select To_date( '03.04.2023', 'dd.mm.yyyy'), 102 From Dual Union All
Select To_date( '06.04.2023', 'dd.mm.yyyy'), 200 From Dual
)
-- M a i n S Q L :
SELECT X_DT "DT",
Nvl(AMNT, LAST_VALUE(AMNT IGNORE NULLS) Over(Order By X_DT Rows Between Unbounded Preceding And 1 Preceding)) "AMNT"
FROM ( Select DAY_ID, t.DT, t.AMNT,
x.MIN_DT, x.MAX_DT, x.MNTH_ID,
Case When DAY_ID <= To_Char(LAST_DAY(To_Date('01.' || MNTH_ID, 'dd.mm.yyyy')), 'dd')
Then To_Date(DAY_ID || '.' || MNTH_ID, 'dd.mm.yyyy')
End "X_DT"
From ( Select LPAD(LEVEL, 2, '0') "DAY_ID" From Dual Connect By LEVEL <= 31 ) d
Left Join ( Select To_Char(DT, 'mm.yyyy') "MNTH_ID", Min(DT) "MIN_DT", Max(DT) "MAX_DT" From tbl Group By To_Char(DT, 'mm.yyyy')) x ON(1 = 1)
Left Join tbl t ON(t.DT = Case When DAY_ID <= To_Char(LAST_DAY(To_Date('01.' || MNTH_ID, 'dd.mm.yyyy')), 'dd')
Then To_Date(DAY_ID || '.' || MNTH_ID, 'dd.mm.yyyy')
End)
)
WHERE X_DT Between MIN_DT And MAX_DT
ORDER BY X_DT
--
-- R e s u l t :
DT AMNT
--------- ----------
02-APR-23 100
03-APR-23 102
04-APR-23 102
05-APR-23 102
06-APR-23 200