Cómo rellenar datos de moneda utilizando una tabla de calendario y datos de moneda actualizados mensualmente.
Tengo un problema de SQL que no logro resolver ni encontrar soluciones que me ayuden. Estoy utilizando un grupo sin servidor de SQL en Azure Synapse.
Mi problema es que no sé cómo rellenar las tasas para cada fecha hasta que haya una actualización. Por ejemplo, el cambio de CNY a USD se actualiza el 1 y el 30 de cada mes. Necesito llenar la misma tasa de cambio del día 1 para todos los días hasta el día 30, cuando cambie la tasa, y así sucesivamente…
Mis tablas:
1 – Tasa de cambio
FromCurrencyCode | ToCurrencyCode | Tasa de cambio | Fecha de cambio |
---|---|---|---|
CHF | USD | 0.98068059233108 | 2019-04-30 22:30:01.0 |
CHF | USD | 0.98068059233108 | 2019-04-30 22:30:02.0 |
2 – Tabla de calendario
Fecha de calendario | Día de calendario | Mes de calendario | Año de calendario |
---|---|---|---|
2019-01-03 | 3 | Enero | 2019 |
2019-01-04 | 4 | Enero | 2019 |
Este es un problema porque estoy uniendo una lista de IDs con monedas extranjeras a la tabla de tasas de cambio basándome en la fecha de creación. Por lo tanto, puedo crear un proyecto el día 15 del mes, entre las 2 actualizaciones, y utilizar la tasa de cambio más reciente para él (es decir, la tasa del día 1).
He intentado usar joins izquierdos como punto de partida, como se muestra a continuación:
SELECT distinct t1.[FromCurrencyCode],
t1.[ToCurrencyCode],
t1.[ExchangeRate],
t2.[Calendar_Date]
FROM [dbo].[ExchangeRate] t1 join [dbo].[Calendar] t2 on convert(date,t1.ExchangeDate) =
t2.Calendar_Date
order by t1.FromCurrencyCode, t2.Calendar_Date
Lo cual da como resultado:
He revisado muchas soluciones antiguas que involucran expresiones recursivas de tabla común (CTE), pero ninguna parece funcionar para mí hasta ahora. Las monedas no son las mismas en los ejemplos, ya que son datos de muestra en las tablas para que puedas entender la estructura.
¡Cualquier ayuda sería muy apreciada!
davy.ai
Para rellenar las tasas para cada fecha hasta que haya una actualización, se puede utilizar una Expresión de Tabla Común (CTE, por sus siglas en inglés) con una unión izquierda. Aquí tienes un ejemplo de consulta:
Lo que esta consulta hace es crear una CTE que une las tablas ExchangeRate y Calendar, utilizando ExchangeDate como condición de unión. Esto crea una fila para cada tasa de cambio de moneda en cada fecha del calendario hasta e incluyendo ExchangeDate. También añadimos una columna de número de fila (rn) para clasificar las filas por ExchangeDate en orden descendente, particionado por FromCurrencyCode y ToCurrencyCode.
Luego unimos esta CTE a la tabla Calendar de nuevo para obtener todas las fechas del calendario y filtrar solo las filas con la última ExchangeDate (rn = 1).
Finalmente, seleccionamos las columnas que queremos y ordenamos los resultados por FromCurrencyCode y Calendar_Date.
Esta consulta debería darte las tasas rellenadas deseadas para cada par de monedas y fecha.