es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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!

Tags:  , , , ,

Answer

  1. Avatar for 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:

    WITH cte AS (
      SELECT er.FromCurrencyCode, er.ToCurrencyCode, er.ExchangeRate, 
             c.Calendar_Date, ROW_NUMBER() OVER (PARTITION BY er.FromCurrencyCode, er.ToCurrencyCode ORDER BY er.ExchangeDate DESC) AS rn
      FROM dbo.ExchangeRate er
      JOIN dbo.Calendar c ON c.Calendar_Date <= er.ExchangeDate
    )
    SELECT cte.FromCurrencyCode, cte.ToCurrencyCode, cte.ExchangeRate, c.Calendar_Date
    FROM cte
    JOIN dbo.Calendar c ON c.Calendar_Date = cte.Calendar_Date
    WHERE cte.rn = 1
    ORDER BY cte.FromCurrencyCode, c.Calendar_Date
    

    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.

Comments are closed.