0

契約に関する情報を保持するテーブルと、為替レートを保持するテーブルの 2 つのテーブルがあります。

為替レート テーブルは 3 つのフィールドで構成されています。2 つの主キー、通貨コード (例: EURO) 用、および為替レートの開始日用の 1 つです。

-為替レートを保持する1つのフィールド

コントラクト テーブルは、為替レート テーブルとコントラクトの日付への外部キーとしての通貨コードと共に、コントラクトに関する標準情報を保持するだけです。

契約日に適用される為替レートとともに、各契約を個別に選択できるようにしたいと考えています。たとえば、私の契約日が 2012 年 9 月 20 日で、その契約の通貨に対して 3 つの為替レートがあるとします。 9月30日から始まります。9 月 20 日はその「期間」内にあるため、9 月 12 日の為替レートのみが契約データと共に返され、他のレートは返されないようにするにはどうすればよいでしょうか。

ある種のサブクエリが必要でしょうか?

SQL Server 2005 を使用しています。

4

1 に答える 1

0

データ構造の問題は、レートの最初の日付はあるが最後の日付がないことです。これを行う 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 で通貨期間の終了日を割り当てています。最新の場合、終了日は明日です。おそらく、すべての fxrate は過去のものです。次に、このテーブルに結合して、契約に適したレートを取得します。

于 2012-10-04T18:02:02.470 に答える