如何使用日历 table 和每月更新的货币数据回填货币数据
How to backfill currency data using calendar table and currency data updated monthly
我有一个 SQL 问题,我无法弄清楚或似乎找不到任何有帮助的解决方案。我在 Azure Synapse 上使用 SQL 无服务器池。
我的问题是,在有更新之前,我不知道如何回填每个日期的费率。例如,在每月的 1 号和 30 号更新 CNY 到 USD。我需要每天填写与1日相同的汇率,直到30日汇率变化等等...
我的table:
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 - 日历 Table
Calendar_Date
Calendar_Day
Calendar_Month
Calendar_Year
2019-01-03
3
January
2019
2019-01-04
4
January
2019
这是一个问题,因为我将外币 ID 列表加入到基于创建日期的汇率 table。所以我可以在每月的 15 日创建一个项目,在两次更新之间,并为其使用最新的更新率(即第一次率)。
我试过使用左连接作为起点,如下所示:
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
我看过很多涉及递归通用 table 表达式 (CTE) 的旧解决方案,但到目前为止 none 似乎对我有用。示例中的货币不相同,因为它是 table 中的示例数据,因此您可以理解布局!
如有任何帮助,我们将不胜感激!
如果我理解你的问题,你希望两个 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
我有一个 SQL 问题,我无法弄清楚或似乎找不到任何有帮助的解决方案。我在 Azure Synapse 上使用 SQL 无服务器池。
我的问题是,在有更新之前,我不知道如何回填每个日期的费率。例如,在每月的 1 号和 30 号更新 CNY 到 USD。我需要每天填写与1日相同的汇率,直到30日汇率变化等等...
我的table: 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 - 日历 Table
Calendar_Date | Calendar_Day | Calendar_Month | Calendar_Year |
---|---|---|---|
2019-01-03 | 3 | January | 2019 |
2019-01-04 | 4 | January | 2019 |
这是一个问题,因为我将外币 ID 列表加入到基于创建日期的汇率 table。所以我可以在每月的 15 日创建一个项目,在两次更新之间,并为其使用最新的更新率(即第一次率)。
我试过使用左连接作为起点,如下所示:
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
我看过很多涉及递归通用 table 表达式 (CTE) 的旧解决方案,但到目前为止 none 似乎对我有用。示例中的货币不相同,因为它是 table 中的示例数据,因此您可以理解布局!
如有任何帮助,我们将不胜感激!
如果我理解你的问题,你希望两个 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