Query Mes actual, mes anterior y trimestre pasado por país y motor
Publicado por Cristina (1 intervención) el 23/08/2021 10:02:31
Buenos días,
Tengo esta lista de fechas, motores y países (a futuro vendrán más registros para cada campo):
data_date_part engine country_code
2021-06-30 dividend ES
2021-05-31 ir_delta
2021-04-30 repomargin
2021-04-05
2021-03-31
2021-03-15
2020-06-30
2020-05-31
Que corresponden a la siguiente tabla, porque cada engine tiene una fecha distinta:
country_code data_date_part engine
ES 2021-06-30 dividend
ES 2021-05-31 dividend
ES 2021-04-30 dividend
ES 2021-04-05 dividend
ES 2021-03-31 dividend
ES 2021-03-15 dividend
ES 2021-04-30 ir_delta
ES 2021-03-15 ir_delta
ES 2021-06-30 repomargin
ES 2021-05-31 repomargin
ES 2021-03-31 repomargin
ES 2020-06-30 repomargin
ES 2020-05-31 repomargin
Lo que necesito conseguir, es traer para cada engine (dividend, ir_delta, repomargin) y cada país, 3 fechas.
1. La fecha máxima (la más actual hasta el momento)
2. La fecha correspondiente a fin de mes, del mes anterior al máximo obtenido.
3. La fecha de cierre de trimestre, respecto a esa fecha máxima inicial.
Siguiendo un ejemplo, para dividend, sería:
1. Fecha máxima sería el 2021-06-30
2. Fecha de cierre de mes anterior sería 2021-05-31
3. El cierre de trimestre sería 2021-03-31. Si la fecha del 2021-03-31 no existiese, la fecha de cierre de trimestre debería ser 2021-03-15, porque sería la máxima existente de marzo y la tendría que tomar como un cierre.
Ahora mismo la query que tengo hecha es la siguiente:
select *,
tab1.data_date_part,
tab1.country_code,
tab1.engine
from bu_fva.fva_output_engines tab1
INNER JOIN (select country_code, engine, data_date_part,
row_number() over(partition by country_code, engine, left(data_date_part,7)
order by country_code, engine, data_date_part desc) as fila
from bu_fva.fva_output_engines) tab2
ON tab1.country_code=tab2.country_code and tab1.engine=tab2.engine and tab1.data_date_part=tab2.data_date_part
where fila < 3;
y me da como resultado:
Country Code data_date_part Engine
ES 2021-06-30 dividend
ES 2021-05-31 dividend
ES 2021-04-30 dividend
ES 2021-03-31 dividend
ES 2021-04-30 ir_delta
ES 2021-03-15 ir_delta
ES 2021-06-30 repomargin
ES 2021-05-31 repomargin
ES 2021-03-31 repomargin
ES 2020-06-30 repomargin
ES 2020-05-31 repomargin
Las marcadas en negrita no debería de traerlas. Además el trimestre no está contemplado en la query, y no se como añadirlo.
Alguien puede ofrecerme su ayuda?
Muchas gracias de antemano
Tengo esta lista de fechas, motores y países (a futuro vendrán más registros para cada campo):
data_date_part engine country_code
2021-06-30 dividend ES
2021-05-31 ir_delta
2021-04-30 repomargin
2021-04-05
2021-03-31
2021-03-15
2020-06-30
2020-05-31
Que corresponden a la siguiente tabla, porque cada engine tiene una fecha distinta:
country_code data_date_part engine
ES 2021-06-30 dividend
ES 2021-05-31 dividend
ES 2021-04-30 dividend
ES 2021-04-05 dividend
ES 2021-03-31 dividend
ES 2021-03-15 dividend
ES 2021-04-30 ir_delta
ES 2021-03-15 ir_delta
ES 2021-06-30 repomargin
ES 2021-05-31 repomargin
ES 2021-03-31 repomargin
ES 2020-06-30 repomargin
ES 2020-05-31 repomargin
Lo que necesito conseguir, es traer para cada engine (dividend, ir_delta, repomargin) y cada país, 3 fechas.
1. La fecha máxima (la más actual hasta el momento)
2. La fecha correspondiente a fin de mes, del mes anterior al máximo obtenido.
3. La fecha de cierre de trimestre, respecto a esa fecha máxima inicial.
Siguiendo un ejemplo, para dividend, sería:
1. Fecha máxima sería el 2021-06-30
2. Fecha de cierre de mes anterior sería 2021-05-31
3. El cierre de trimestre sería 2021-03-31. Si la fecha del 2021-03-31 no existiese, la fecha de cierre de trimestre debería ser 2021-03-15, porque sería la máxima existente de marzo y la tendría que tomar como un cierre.
Ahora mismo la query que tengo hecha es la siguiente:
select *,
tab1.data_date_part,
tab1.country_code,
tab1.engine
from bu_fva.fva_output_engines tab1
INNER JOIN (select country_code, engine, data_date_part,
row_number() over(partition by country_code, engine, left(data_date_part,7)
order by country_code, engine, data_date_part desc) as fila
from bu_fva.fva_output_engines) tab2
ON tab1.country_code=tab2.country_code and tab1.engine=tab2.engine and tab1.data_date_part=tab2.data_date_part
where fila < 3;
y me da como resultado:
Country Code data_date_part Engine
ES 2021-06-30 dividend
ES 2021-05-31 dividend
ES 2021-04-30 dividend
ES 2021-03-31 dividend
ES 2021-04-30 ir_delta
ES 2021-03-15 ir_delta
ES 2021-06-30 repomargin
ES 2021-05-31 repomargin
ES 2021-03-31 repomargin
ES 2020-06-30 repomargin
ES 2020-05-31 repomargin
Las marcadas en negrita no debería de traerlas. Además el trimestre no está contemplado en la query, y no se como añadirlo.
Alguien puede ofrecerme su ayuda?
Muchas gracias de antemano
Valora esta pregunta
0