【问题标题】:How to backfill currency data using calendar table and currency data updated monthly如何使用日历表和每月更新的货币数据回填货币数据
【发布时间】:2022-01-16 22:46:44
【问题描述】:

我有一个无法解决的 SQL 问题,或者似乎找不到任何可以解决问题的解决方案。我在 Azure Synapse 上使用 SQL 无服务器池。

我的问题是,在有更新之前,我无法弄清楚如何回填每个日期的费率。例如人民币兑美元在每月 1 日和 30 日更新。我需要每天填写与 1 日相同的汇率,直到 30 日汇率发生变化等等...

我的桌子: 1 - 汇率

FromCurrencyCode ToCurrencyCode Exchange Rate ExchangeDate
CHF USD 0.98068059233108 2019-04-30 22:30:01.0
CHF USD 0.98068059233108 2019-04-30 22:30:02.0

2 - 日历表

Calendar_Date Calendar_Day Calendar_Month Calendar_Year
2019-01-03 3 January 2019
2019-01-04 4 January 2019

这是一个问题,因为我根据创建日期将具有外币的 ID 列表加入到汇率表中。所以我可以在每月 15 日创建一个项目,在 2 次更新之间,并为其使用最新的更新率(即 1sts 率)。

我尝试使用左连接作为起点,如下所示:

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

这会导致: [1]:https://i.stack.imgur.com/cNSqz.png

我查看了很多涉及递归公用表表达式 (CTE) 的旧解决方案,但到目前为止似乎没有一个对我有用。示例中的货币并不相同,因为它是表格中的示例数据,因此您可以理解布局!

任何帮助将不胜感激!

【问题讨论】:

    标签: sql-server left-join common-table-expression azure-synapse currency-exchange-rates


    【解决方案1】:

    如果我理解您的问题,您希望每天两个 ExchangeDate 之间的每个日期都具有相同的 ExchangeRate,为此,您可以使用此查询:

    SELECT DISTINCT t1.[FromCurrencyCode]
       ,t1.[ToCurrencyCode]
       ,t1.[ExchangeRate]
       ,t2.[Calendar_Date]
    FROM (
        SELECT DISTINCT [FromCurrencyCode]
            ,[ToCurrencyCode]
            ,[ExchangeRate]
            ,ExchangeDate StartExchangeDate
            ,LEAD(ExchangeDate) OVER (
                PARTITION BY [FromCurrencyCode]
                ,[ToCurrencyCode] ORDER BY ExchangeDate
            ) EndExchangeDate
        FROM [dbo].[ExchangeRate]
    ) t1
    JOIN [dbo].[Calendar] t2 ON t2.Calendar_Date >=  t1.StartExchangeDate AND 
        t2.Calendar_Date < t1.EndExchangeDate
    ORDER BY t1.FromCurrencyCode
        ,t2.Calendar_Date
    

    【讨论】:

    • 您好,感谢您的快速回复,基本上我每天都在寻找相同的费率,直到更新 --- 假设 --> 1 日的费率是 1,30 日的费率是 2 -- 1 月 1 日至 29 日将有 1 个,30 日将有 2 个
    • 您是否测试了查询,这应该会给您想要的结果,如果它不起作用,您应该更改为ORDER BY DESC
    • 嗨,是的,这个查询似乎按预期工作!非常感谢您为我提供了几周的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-25
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    • 2012-06-12
    • 1970-01-01
    相关资源
    最近更新 更多