Этот запрос объединит последнюю доступную запись за каждый месяц в ваших 3 таблицах.Он не должен генерировать дубликаты, если у вас нет нескольких записей для одного и того же as_of_date
в одной из 3 таблиц.
Он использует JOIN
s для генерации табличных отношений и коррелированных запросов для динамического поиска последней записи каждого месяца в каждой таблице.
Я добавил условие для фильтрации последней записи изcrd
, который не был частью вашего исходного сообщения, если у вас есть несколько записей за один месяц в этой таблице;удалите это, если вам это не нужно.
select
crd.indexname,
count(crd.ISIN),
extract(year from crd.datadate) as yr,
extract(month from crd.datadate) as mth
from
ref_own.v_msci_issuer_id_map maps
join pm_own.esg_credit_factors msci on maps.msci_issuer_id = msci.issuer_id
join pm_own.pma_sec_attributes_hv sec on sec.issuer_id = maps.pimco_issuer_id
join crd_own.ml_corp_index_data_monthly crd on crd.isin = sec.isin
where
maps.active = 1
and msci.as_of_date = (
select max(as_of_date)
from pm_own.esg_credit_factors
where issuer_id = msci.issuer_id and trunc(as_of_date, 'month') = trunc(crd.datadate, 'month')
)
and sec.as_of_date = (
select max(as_of_date)
from pm_own._own.pma_sec_attributes_hv
where issuer_id = sec.issuer_id and trunc(as_of_date, 'month') = trunc(crd.datadate, 'month')
)
and crd.as_of_date = (
select max(as_of_date)
from pm_own._own.pma_sec_attributes_hv
where isin = crd.isin and trunc(as_of_date, 'month') = trunc(crd.datadate, 'month')
)
group by
crd.indexname,
extract(year from crd.datadate) ,
extract(month from crd.datadate)
order by
crd.indexname,
extract(year from crd.datadate) desc ,
extract(month from crd.datadate) desc