根据日期选择适用的行

时间:2012-10-04 17:51:20

标签: sql sql-server

我有两张表,一张持有有关合约的信息,另一张持有汇率。

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

- 保持汇率的一个字段

合约表只保存合约的标准资料以及货币代码作为汇率表的外键及合约日期。

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

某种子查询是否必要?

我正在使用SQL Server 2005。

1 个答案:

答案 0 :(得分: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中指定货币期间的结束日期。对于最近的,结束日期是明天 - 可能是所有的fxrates都在过去。然后它加入到该表中以获得合同的适当费率。