0

我有一个 SQL 问题,我无法弄清楚或似乎找到任何有助于解决问题的解决方案。我在 Azure Synapse 上使用 SQL 无服务器池。

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

我的桌子:1 - 汇率

FromCurrencyCode 到币种代码 汇率 交换日期
瑞士法郎 美元 0.98068059233108 2019-04-30 22:30:01.0
瑞士法郎 美元 0.98068059233108 2019-04-30 22:30:02.0

2 - 日历表

日历_日期 Calendar_Day 日历_月 公历年
2019-01-03 3 一月 2019
2019-01-04 4 一月 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) 的旧解决方案,但到目前为止似乎没有一个对我有用。示例中的货币并不相同,因为它是表格中的示例数据,因此您可以理解布局!

任何帮助将非常感激!

4

1 回答 1

0

如果我理解您的问题,您希望每天两个 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
于 2021-12-13T13:13:47.840 回答