0

我有两张表,一张保存有关合同的信息,另一张保存汇率。

汇率表由 3 个字段组成 - 两个主键,一个用于货币代码(例如 EURO),一个用于汇率的开始日期

- 一个保存汇率的字段

合同表仅包含有关合同的标准信息以及作为汇率表和合同日期的外键的货币代码。

我希望能够单独选择每个合同以及合同日期的适用汇率。例如,如果我的合同日期是 2012 年 9 月 20 日,我对该合同的货币有三种汇率,一种从 9 月 1 日开始,一种从 9 月 12 日开始,另一种9月30日开始。我如何确保只有 9 月 12 日的汇率与合同数据一起返回,而不是任何其他汇率,因为 9 月 20 日属于该“期间”。

是否需要某种子查询?

我正在使用 SQL Server 2005。

4

1 回答 1

0

数据结构的问题是您有第一个日期,但没有最后一个日期日期。一种方法是使用相关子查询。但是,我更喜欢使用排名函数来分配下一个日期:

with fxr as (
     select fx.*,
            row_number() over (partition by ccy order by exdate) as seqnum
     from fx
    ),
     fxrates as (
     select fxr.*, coalesce(fxnext.exdate, getdate()+1) as next_exdate
     from fxr left outer join
          fxr fxnext
          on fxr.ccy = fxnext.ccy and
             fxr.seqnum + 1 = fxnext.seqnum
    )
select c.*, f.fxrate
from contracts c left outer join
     fxrates f
     on c.ccy = f.ccy and
        c.thedate >= f.exdate and
        c.thedate < f.next_exdate

这是在 fxrates CTE 中指定货币周期的结束日期。对于最近的,结束日期是明天——大概所有的汇率都是过去的。然后它加入该表以获得合同的适当费率。

于 2012-10-04T18:02:02.470 回答