2012-10-04 62 views
0

我有两张表,一张持有合约信息,另一张持有汇率。根据日期选择适用的行

汇率表由3个字段 高达 - 两个主键,一个用于货币代码(例如EURO),一个用于交换速率

-One字段,其保持交换的开始日期率

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

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

是否需要某种子查询? 2005年

回答

0

与数据结构的问题

我使用SQL Server是你第一次约会,但不是为了率最后日期。一种方法是使用相关的子查询。不过,我更喜欢使用排序功能,指派下一个日期:

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货币周期的结束日期。对于最近的一次,结束日期是明天 - 可能所有的fxrates都是过去的。然后它加入到这张表中以得到合同的适当费率。