【问题标题】:Selecting applicable rows based on date根据日期选择适用的行
【发布时间】:2012-09-25 19:42:42
【问题描述】:

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

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

-保存汇率的一个字段

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

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

是否需要某种子查询?

我使用的是 SQL Server 2005。

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

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

    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 中指定货币周期的结束日期。对于最近的,结束日期是明天——大概所有的汇率都是过去的。然后它加入该表以获得合同的适当费率。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-04
      • 1970-01-01
      • 1970-01-01
      • 2017-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多